如何在打包的节点应用程序中运行可执行资产

时间:2019-11-05 19:39:40

标签: node.js exec child-process

从打包的节点应用程序运行可执行资产时,我得到了ENOENT。

我想将我的节点应用程序打包到一个可执行文件中。我使用pkg来制作可执行文件。应用程序使用的资产之一是另一个可执行文件,index.js将使用child_process.exec运行。当我调用exec(...)时得到ENOENT,但是该文件作为资产存在。有人遇到这个问题吗?

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”只是一个用c ++编码并使用g ++编译的Hello世界。

输出“ resources”目录输出内容的第一行js行:

main.cpp
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均无效。

0 个答案:

没有答案