我使用电子构建器(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
我必须错过构建过程中的一个步骤。
答案 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。