使用Electron应用程序打包Keytar

时间:2017-04-05 14:26:39

标签: node.js electron electron-builder electron-packager

我使用电子构建器(16.6.2)打包我的电子应用程序,其中包括keytar(3.0.2)作为prod依赖。

package.json文件包括:

"scripts": {
    "postinstall": "install-app-deps",
    "compile:dev": "webpack-dev-server --hot --host 0.0.0.0 --config=./webpack.dev.config.js",
    "compile": "webpack --config webpack.build.config.js",
    "dist": "yarn compile && build"
},
"build": {
    "appId": "com.myproject",
    "asar": true,
    "files": [
      "bin",
      "node_modules",
      "main.js"
    ]
}

当我在同一系统上运行.app时运行正常。当我尝试在不同的系统上运行它(或删除我的node_modules)时,它找不到keytar.node。构建keytar时,它包含我系统的该图像的完全限定路径。我在控制台中收到以下错误:

Uncaught Error: Cannot open /Users/Kevin/Work/myproject/node_modules/keytar/build/Release/keytar.node
Error: dlopen(/Users/Kevin/Work/myproject/node_modules/keytar/build/Release/keytar.node, 
1): image not found

我必须错过构建过程中的一个步骤。

3 个答案:

答案 0 :(得分:2)

事实证明,我在渲染器进程中使用了keytar。我将keytar移动到主进程(不通过Webpack / Babel)并被电子构建器正确打包。

main.js

ipcMain.on('get-password', (event, user) => {
    event.returnValue = keytar.getPassword('ServiceName', user);
});

ipcMain.on('set-password', (event, user, pass) => {
    event.returnValue = keytar.replacePassword('ServiceName', user, pass);
});

然后从渲染器进程中我可以调用

const password = ipcRenderer.sendSync('get-password', user);

ipcRenderer.sendSync('set-password', user, pass);

答案 1 :(得分:0)

<强>更新
我发现(根据OP)转换我的主线程代码(使用keytar)导致调用keytar函数返回String s = in.nextLine();

我不得不从我的webpack配置中删除主线程代码入口点,因此babel没有触及它。我在我的应用程序中包含了我的主线程源代码非捆绑/未编译,并且工作正常。

以下信息仍然代表在您的网络包构建中包含二进制资产。

如果必须转换需要二进制文件的代码,可以将TypeError: keytar.findPassword is not a function添加到webpack配置中。

安装

file-loader

npm i -D file-loader

webpack config (包括yarn add -D file-loader文件)

.dat

如果要保留文件名,可以将..., module: { rules: [{ ... }, { test: /\.dat$/, use: { loader: "file-loader" } }] }, ... 选项传递给加载程序:

name

有关file-loader Github repo的更多信息。

答案 2 :(得分:0)

window.require("electron").remote.require("keytar")

由于您正在处理渲染器进程,并且希望使用系统或主进程中的本机api。