从打包的节点应用程序运行可执行资产时,我得到了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
均无效。