Добавление аддона C ++ приводит к тому, что упакованное приложение создает sh, но оно работает, если я запускаю 'yarn start' - PullRequest
0 голосов
/ 27 марта 2020

Я использую Electron-builder для упаковки моего приложения.

Версия : 22.4.0

Цель : nsis

Добавление пользовательского аддона grp c, написанного на C ++, приводит к сбою упакованного приложения. После того, как я запустил yarn dist и установил приложение, используя результирующую программу установки, я попытался запустить приложение. Но экран становится белым (то есть он ничего не загружает), и примерно через 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"
  }
}

Кроме того, интересно, что приложение, похоже, не взломало sh на 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 cra sh ( см. приложение) Annotation 2020-03-27 012341

1 Ответ

0 голосов
/ 27 марта 2020

Это была проблема с разрешениями.

См. # 4818 .

Выяснили, в чем проблема. Из-за «perMachine»: true и «allowElevation»: true программа была установлена ​​в C: \ ProgramFiles как пользователь с повышенными правами. Но когда я запускаю его, он запускается как пользователь более низкого уровня, у которого нет разрешения на запись в папку.

Может быть исправлено только установкой для текущего пользователя (то есть "perMachine": false)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...