Как запустить исполняемый актив в приложении упакованного узла - PullRequest
0 голосов
/ 05 ноября 2019

Я получаю ENOENT при запуске исполняемого актива из упакованного приложения узла.

Я хочу упаковать свое приложение узла в исполняемый файл. Я использую pkg , чтобы сделать исполняемый файл. Одним из ресурсов, которые использует приложение, является другой исполняемый файл, который index.js будет запускаться с использованием child_process.exec. Я получаю ENOENT, когда я вызываю exec (...), но файл присутствует как актив. Кто-нибудь имел эту проблему?

Index.js:

const exec = require('child_process').exec;
const fs = require('fs');
const path = require('path');

fs.readdir(path.join(__dirname, 'resources'), (error, files) => {
  files.forEach(file => console.log(file));

  exec('./test', { cwd: path.join(__dirname, 'resources') }, (err, stdout) => {
    console.log(stdout);
    if (!err) {
      console.log("ok");
    } else {
      console.log(err);
    }
  })
});

package.js:

{
    "name": "test-exec",
    "version": "1.0.0",
    "main": "index.js",
    "bin": {
        "test": "./index.js"
    },
    "pkg": {
        "assets": [
            "resources/*"
        ]
    }
}

Исполняемый файл "test" - это просто Hello world, закодированный вc ++ и скомпилирован с использованием g ++.

Первые строки js, которые выводят содержимое каталога «resources», выводят:

main.cpp
test

, который показывает, что исполняемый файл «test» был правильно добавлен какактив.

Однако, вызов exec выводит:

{ Error: spawn /bin/sh ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:190:19)
    at onErrorNT (internal/child_process.js:362:16)
    at _combinedTickCallback (internal/process/next_tick.js:139:11)
    at process._tickCallback (internal/process/next_tick.js:181:9)
  errno: 'ENOENT',
  code: 'ENOENT',
  syscall: 'spawn /bin/sh',
  path: '/bin/sh',
  spawnargs: [ '-c', './test' ],
  cmd: './test' }

Есть идеи, как это решить?

Запуск node index.js Выводы:

main.cpp
test
Hello world

ok

PS: изменение exec на execFile или изменение './test' на './resources/test не работает.

...