我想从电子主线程运行一个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++模块与打包的电子应用程序一起使用?
1条答案
按热度按时间jogvjijk1#
我找到了解决方案:问题并不在于. node文件没有找到,而是. node文件需要的dll没有找到(zlibwapi.dll),所以. node文件找到了,但无法加载。
我必须做两件事才能让它工作:
1.我必须将. dll文件作为额外文件添加到package.json中
这将导致dll与未打包的. exe文件位于同一位置(在发布的示例中为
C:\Users\XXX\AppData\Local\Temp\2RbnOiiTeglX50ZVX8JnWd0mNKr
)。1.我必须将fork命令的工作目录更改为相同的路径:
在这个过程中,我还去掉了
nodeGypRebuild
选项,不知道这是否也有影响。