Упаковка 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 репо.

Другие вопросы по тегам