添加 C++ 插件会导致打包的应用程序崩溃,但如果我 运行 'yarn start' 它会起作用
Adding a C++ addon causes the packaged app to crash, but it works if I run 'yarn start'
我正在使用 Electron-builder 来打包我的应用程序。
版本:22.4.0
目标:nsis
添加用 C++ 编写的自定义 grpc 客户端插件会使打包的应用程序崩溃。在我 运行 yarn dist
并使用生成的安装程序 exe 安装应用程序后,我尝试启动该应用程序。但是屏幕变白(即没有加载任何内容),大约 5 秒后,应用程序崩溃了。如果我使用 yarn/npm start
从节点启动应用程序,它工作正常,所以我不认为问题出在插件本身,可能是我在 package.json
中的设置;因为那是我至今最痛苦的事情。
我的包json文件:
{
"name": "XYXYXYX",
"version": "0.1.0",
"description": "",
"main": "app.js",
"nodeGypRebuild":"true",
"scripts": {
"start": "electron .",
"test": "echo \"Error: no test specified\" && exit 1",
"pack": "electron-builder --dir",
"dist": "electron-builder",
"postinstall": "electron-builder install-app-deps"
},
"build": {
"appId": "xfilter.optima",
"win": {
"target": "nsis"
},
"nsis": {
"oneClick": false,
"perMachine": true,
"allowElevation": true,
"runAfterFinish": false
}
},
"author": "XXXX",
"license": "SEE LICENSE IN LICENSE",
"devDependencies": {
"electron": "^8.0.0",
"electron-builder": "^22.4.0"
},
"dependencies": {
"electron-is-dev": "^1.1.0",
"is-unc-path": "^1.0.0",
"material-design-icons": "^3.0.1",
"materialize-css": "^1.0.0-rc.2",
"mongodb": "^3.5.2",
"node-addon-api": "*",
"sharp": "^0.24.1",
"typeface-roboto": "0.0.75"
}
}
此外,有趣的是,应用程序似乎并没有在 require()
语句处崩溃,而是当我 运行 从我的 C++ 端导出的函数时崩溃。
C++ 表面(以防万一):
#include <napi.h>
#include <ApiWorker.h>
using namespace Napi;
void runFilter(const CallbackInfo& info)
{
String panel_id = info[0].As<String>();
Function callback = info[1].As<Function>();
ApiWorker* _apiworker = new ApiWorker(panel_id, callback);
_apiworker->Queue();
}
Object Init(Env env, Object exports)
{
exports.Set(String::New(env, "runFilter"),
Function::New(env, runFilter));
return exports;
}
NODE_API_MODULE(NODE_GYP_MODULE_NAME, Init)
我正在尝试像
一样调用 runFilter()
const filter = require('addon.node')
filter.runFilter("foobar", () => {console.log("Done");})
ApiWorker
是一个 AsyncWorker
(派生自 Napi::AsyncWorker
)
PS:如果我在开发模式下运行,那么devtools会崩溃(见附件)
这是一个权限问题。
见#4818。
Figured out what the issue was. Because of "perMachine": true and
"allowElevation": true, the program was getting installed into
C:\ProgramFiles as an elevated user. But when I run it, it runs as a
lower level user who doesn't have permission to write to the folder.
Can be fixed by only installing for the current user (i.e.
"perMachine": false)
我正在使用 Electron-builder 来打包我的应用程序。
版本:22.4.0
目标:nsis
添加用 C++ 编写的自定义 grpc 客户端插件会使打包的应用程序崩溃。在我 运行 yarn dist
并使用生成的安装程序 exe 安装应用程序后,我尝试启动该应用程序。但是屏幕变白(即没有加载任何内容),大约 5 秒后,应用程序崩溃了。如果我使用 yarn/npm start
从节点启动应用程序,它工作正常,所以我不认为问题出在插件本身,可能是我在 package.json
中的设置;因为那是我至今最痛苦的事情。
我的包json文件:
{
"name": "XYXYXYX",
"version": "0.1.0",
"description": "",
"main": "app.js",
"nodeGypRebuild":"true",
"scripts": {
"start": "electron .",
"test": "echo \"Error: no test specified\" && exit 1",
"pack": "electron-builder --dir",
"dist": "electron-builder",
"postinstall": "electron-builder install-app-deps"
},
"build": {
"appId": "xfilter.optima",
"win": {
"target": "nsis"
},
"nsis": {
"oneClick": false,
"perMachine": true,
"allowElevation": true,
"runAfterFinish": false
}
},
"author": "XXXX",
"license": "SEE LICENSE IN LICENSE",
"devDependencies": {
"electron": "^8.0.0",
"electron-builder": "^22.4.0"
},
"dependencies": {
"electron-is-dev": "^1.1.0",
"is-unc-path": "^1.0.0",
"material-design-icons": "^3.0.1",
"materialize-css": "^1.0.0-rc.2",
"mongodb": "^3.5.2",
"node-addon-api": "*",
"sharp": "^0.24.1",
"typeface-roboto": "0.0.75"
}
}
此外,有趣的是,应用程序似乎并没有在 require()
语句处崩溃,而是当我 运行 从我的 C++ 端导出的函数时崩溃。
C++ 表面(以防万一):
#include <napi.h>
#include <ApiWorker.h>
using namespace Napi;
void runFilter(const CallbackInfo& info)
{
String panel_id = info[0].As<String>();
Function callback = info[1].As<Function>();
ApiWorker* _apiworker = new ApiWorker(panel_id, callback);
_apiworker->Queue();
}
Object Init(Env env, Object exports)
{
exports.Set(String::New(env, "runFilter"),
Function::New(env, runFilter));
return exports;
}
NODE_API_MODULE(NODE_GYP_MODULE_NAME, Init)
我正在尝试像
一样调用runFilter()
const filter = require('addon.node')
filter.runFilter("foobar", () => {console.log("Done");})
ApiWorker
是一个 AsyncWorker
(派生自 Napi::AsyncWorker
)
PS:如果我在开发模式下运行,那么devtools会崩溃(见附件)
这是一个权限问题。
见#4818。
Figured out what the issue was. Because of "perMachine": true and "allowElevation": true, the program was getting installed into C:\ProgramFiles as an elevated user. But when I run it, it runs as a lower level user who doesn't have permission to write to the folder.
Can be fixed by only installing for the current user (i.e. "perMachine": false)