使用 Electron 应用程序打包 Keytar
Packaging Keytar with an Electron app
我正在使用 electron-builder (16.6.2) 打包我的电子应用程序,其中包括 keytar (3.0.2) 作为产品依赖项。
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
我一定是在构建过程中遗漏了一个步骤。
事实证明,我在渲染器进程中使用了 keytar。我将 keytar 移入主进程(不通过 Webpack / Babel)并由 electron-builder 正确打包。
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);
更新:
我发现(根据 OP)转译我的主线程代码(使用 keytar)导致调用 keytar 函数返回 TypeError: keytar.findPassword is not a function
.
我不得不从我的 webpack 配置中删除主线程代码入口点,这样它就不会被 babel 触及。我在我的应用程序中包含了我的主线程源代码 unbundled/not transpiled 并且它运行良好。
以下信息仍然代表在您的 webpack 构建中包含二进制资源。
如果您必须转译需要二进制文件的代码,您可以将 file-loader
添加到您的 webpack 配置中。
安装
npm i -D file-loader
或
yarn add -D file-loader
webpack 配置(包含一个.dat
文件)
...,
module: {
rules: [{
...
}, {
test: /\.dat$/,
use: {
loader: "file-loader"
}
}]
},
...
如果要保留文件名,可以将 name
选项传递给加载器:
use: {
loader: "file-loader",
options: {
name: "[name].[ext]"
}
}
有关 file-loader
Github repo 的更多信息。
window.require("electron").remote.require("keytar")
由于您正在处理渲染器进程并希望使用来自系统或主进程的本机 api。
我正在使用 electron-builder (16.6.2) 打包我的电子应用程序,其中包括 keytar (3.0.2) 作为产品依赖项。
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
我一定是在构建过程中遗漏了一个步骤。
事实证明,我在渲染器进程中使用了 keytar。我将 keytar 移入主进程(不通过 Webpack / Babel)并由 electron-builder 正确打包。
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);
更新:
我发现(根据 OP)转译我的主线程代码(使用 keytar)导致调用 keytar 函数返回 TypeError: keytar.findPassword is not a function
.
我不得不从我的 webpack 配置中删除主线程代码入口点,这样它就不会被 babel 触及。我在我的应用程序中包含了我的主线程源代码 unbundled/not transpiled 并且它运行良好。
以下信息仍然代表在您的 webpack 构建中包含二进制资源。
如果您必须转译需要二进制文件的代码,您可以将 file-loader
添加到您的 webpack 配置中。
安装
npm i -D file-loader
或
yarn add -D file-loader
webpack 配置(包含一个.dat
文件)
...,
module: {
rules: [{
...
}, {
test: /\.dat$/,
use: {
loader: "file-loader"
}
}]
},
...
如果要保留文件名,可以将 name
选项传递给加载器:
use: {
loader: "file-loader",
options: {
name: "[name].[ext]"
}
}
有关 file-loader
Github repo 的更多信息。
window.require("electron").remote.require("keytar")
由于您正在处理渲染器进程并希望使用来自系统或主进程的本机 api。