node
const child = cp.spawn('npm', ['run', 'build']);
报错
events.js:182 throw er; // Unhandled 'error' event ^ Error: spawn npm ENOENT at exports._errnoException (util.js:1016:11) at Process.ChildProcess._handle.onexit (internal/child_process.js:189:19) at onErrorNT (internal/child_process.js:366:16) at _combinedTickCallback (internal/process/next_tick.js:102:11) at process._tickCallback (internal/process/next_tick.js:161:9)
原因:
当我们执行 npm
时,我们实际执行的是 npm.cmd
批处理,而在 Windows 上,.cmd
, .bat
批处理是无法脱离 cmd.exe
这一解释器而单独运行的
解决方案:
1.显式地调用 cmd,
spawn('cmd', ['/c', 'npm'], {
stdio: 'inherit'
});
2.调用 spawn
函数时,设置 shell
选项为 true
以隐式地调用 cmd
(该选项添加自 Node.js v6 版本)
spawn('npm', {
stdio: 'inherit',
shell: true
});
针对最上面的代码,可以修改为:
const child = cp.spawn('npm', ['run', 'build'], { shell: process.platform === 'win32' });
相关链接:
zzz.buzz:Node.js 编写跨平台 spawn 语句