为什么会这样:
var exec = require("child_process").exec;
var command = exec("grunt");
但这会引发错误:
var spawn = require("child_process").spawn;
var command = spawn("grunt");
它引发的错误是Error: spawn ENOENT
起初我认为它可能与env
有关,但在exec
和spawn.
中完全相同我认为它必须与某些事情有关Grunt,因为尝试git
同时适用。
答案 0 :(得分:3)
在检查spawn
的节点docs时,我找到了:
请注意,如果spawn收到一个空的选项对象,它将导致 使用空环境而不是使用来生成进程 process.env。这是由于向后兼容性问题 弃用的API。
exec中env
的默认选项为null
,但对于spawn,它为process.env
。如果两者都变得相同env
那么它是不明确的?你能否通过明确地为两者提供env
来检查这一点。
答案 1 :(得分:1)
我遇到了同样的问题。它只出现在Windows平台上。最后,我发现this issue帮助我解决了这个问题。
我遵循isaacs
建议:
根据平台,cmd是“sh”或“cmd”,arg是 始终是/ c $ cmd或-c $ cmd。
child = child_process.spawnShell('util.bat glerp gorp', {options...})
哪个是糖:
child = child_process.spawn(isWin ? 'cmd' : 'sh', [isWin?'/c':'-c', arg], options)
然后,我写了我自己的简单spawnShell
:
var spawn = require('child_process').spawn;
function spawnShell(args,options){
var isWin = (process.platform === 'win32');
args.unshift(isWin ? '/c' : '-c');
return spawn(isWin ? 'cmd' : 'sh', args, options);
}
虽然现在有点晚了,但希望我的回答在未来仍可以帮助其他人。