Упаковка Keytar с приложением Electron
Я использую Electronic 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
Я должен пропустить шаг в процессе сборки.
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);
window.require("electron").remote.require("keytar")
Поскольку вы работаете над процессом рендеринга и хотите использовать нативный API из системного или основного процесса.
Обновить:
Я обнаружил (согласно OP), что при переносе кода основного потока (который использует keytar) приводил к вызовам функций keytar, возвращающих TypeError: keytar.findPassword is not a function
,
Мне пришлось удалить точку ввода кода основного потока из моей конфигурации webpack, чтобы babel не коснулся ее. Я включил исходный код основного потока в мое приложение, разделенное / не перенесенное, и оно работало нормально.
Приведенная ниже информация по-прежнему означает включение бинарных ресурсов в сборку вашего веб-пакета.
Если вам нужно передать код, который требует двоичного файла, вы можете добавить file-loader
в ваш конфиг веб-пакета.
устанавливать
npm i -D file-loader
или жеyarn add -D file-loader
Конфигурация веб-пакета (чтобы включить .dat
файл)
...,
module: {
rules: [{
...
}, {
test: /\.dat$/,
use: {
loader: "file-loader"
}
}]
},
...
Если вы хотите сохранить имя файла, вы можете передать name
варианты к загрузчику:
use: {
loader: "file-loader",
options: {
name: "[name].[ext]"
}
}
Более подробная информация о file-loader
Github репо.