electron-builder应用程序找不到node-gyp编译 *.node模块

p8h8hvxi  于 2023-06-27  发布在  Electron
关注(0)|答案(1)|浏览(435)

我想从电子主线程运行一个express服务器后端,它使用一个用node-gyp编译的C++模块(称为BackendCppNode.node)。
后端脚本包含使用const backendCpp = require('./BackendCppNode.node')的模块。当运行在电子,它的工作很好,但当 Package 与电子建设者它不工作。运行打包的应用程序时,找不到.node文件,尽管该文件存在于为运行应用程序而创建的临时文件夹中。
准确的错误信息是

[2023-06-23T13:40:59.531Z] [31merror[39m: uncaughtException: The specified module could not be found.
\\?\C:\Users\XXX\AppData\Local\Temp\6c7c5c03-6990-4ca0-917b-4f8cd9ab0cf0.tmp.node
Error: The specified module could not be found.
\\?\C:\Users\XXX\AppData\Local\Temp\6c7c5c03-6990-4ca0-917b-4f8cd9ab0cf0.tmp.node
    at process.func [as dlopen] (node:electron/js2c/asar_bundle:2:1822)
    at Module._extensions..node (node:internal/modules/cjs/loader:1259:18)
    at Object.func [as .node] (node:electron/js2c/asar_bundle:2:2049)
    at Module.load (node:internal/modules/cjs/loader:1044:32)
    at Module._load (node:internal/modules/cjs/loader:885:12)
    at f._load (node:electron/js2c/asar_bundle:2:13330)
    at Module.require (node:internal/modules/cjs/loader:1068:19)
    at require (node:internal/modules/cjs/helpers:103:18)
    at Object.<anonymous> (C:\Users\XXX\AppData\Local\Temp\2RbnOiiTeglX50ZVX8JnWd0mNKr\resources\app.asar\dist\backend\backend.js:9:20)
    at Module._compile (node:internal/modules/cjs/loader:1174:14)

临时文件夹“2 RbnOii....”和文件“6c7c5c...tmp.node”存在,并且.node文件是所需的文件。一个.js文件,它也以与.node文件相同的方式包含在内,被解压缩到temp文件夹并正确包含在内。只有.node文件被复制到其他位置,但找不到。
我的电子构建器配置(在package.json中)是

"build": {
    "appId": "XXX",
    "productName": "XXX",
    "files": [
      "app.js",
      "preload.js",
      "dist/**/*"
    ],
    "directories": {
      "output": "release"
    },
    "win": {
      "icon": "/src/assets/icons/XXX.png",
      "target": "portable"
    },
    "nodeGypRebuild": false
  },

js脚本和BackendCppNode.node文件位于dist/backend/中。backend.js脚本在electron主线程中启动

const resourcePath = path.join(__dirname, 'dist');
  const env = { ...process.env };
  backend = fork(path.join(resourcePath, 'backend', 'backend.js'), [], { cwd: path.join(__dirname, '..'), env, silent: true });

如何将C++模块与打包的电子应用程序一起使用?

jogvjijk

jogvjijk1#

我找到了解决方案:问题并不在于. node文件没有找到,而是. node文件需要的dll没有找到(zlibwapi.dll),所以. node文件找到了,但无法加载。
我必须做两件事才能让它工作:
1.我必须将. dll文件作为额外文件添加到package.json中

"win": {
  "icon": "/src/assets/icons/XXX.png",
  "target": "portable",
  "extraFiles": [
    {
      "from": "dist/backend/zlibwapi.dll",
      "to": "."
    }
  ]
}

这将导致dll与未打包的. exe文件位于同一位置(在发布的示例中为C:\Users\XXX\AppData\Local\Temp\2RbnOiiTeglX50ZVX8JnWd0mNKr)。
1.我必须将fork命令的工作目录更改为相同的路径:

var basepath = path.resolve(app.getPath('exe'), '..');
const env = { ...process.env };
backend = fork(path.join(resourcePath, 'backend', 'backend.js'), [], { cwd: basepath, env, silent: true });

在这个过程中,我还去掉了nodeGypRebuild选项,不知道这是否也有影响。

相关问题