执行nodejs脚本去运行一个npm install
的shell指令时了报个错
image.png
node:events:491
throw er; // Unhandled 'error' event
^
Error: spawn npm ENOENT
at Process.ChildProcess._handle.onexit (node:internal/child_process:285:19)
at onErrorNT (node:internal/child_process:485:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (node:internal/child_process:291:12)
at onErrorNT (node:internal/child_process:485:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
errno: -4058,
code: 'ENOENT',
syscall: 'spawn npm',
path: 'npm',
spawnargs: [ 'install', 'node-sass@6.0.1', '--no-save' ]
}
原因
因为在 Windows 上,当我们在shell中执行 npm 时,我们实际执行的是 npm.cmd
批处理
image.png
在windows的shell里面去执行npm指令,实际上会先去找npm.exe,找不到的情况下会再去找npm.cmd或者npm.bat,这是只有windows的shell才有的查找逻辑
而在nodejs的的spawn下执行npm,则没有这种查找逻辑,只会找npm.exe,根据上方的截图,目录下并没有npm.exe文件,所以就会报错了
解决
方案1
把原本的指令从npm 变成npm.cmd即可,需要判断下环境
npmInstall = spawn(process.platform === 'win32' ? 'npm.cmd' : 'npm', ['install', nodeSassV4, '--no-save'], {
stdio: 'inherit',
});
方案2
加一个shell参数,也是判断环境
npmInstall = spawn('npm', ['install', nodeSassV4, '--no-save'], {
stdio: 'inherit',
// 仅在当前运行环境为 Windows 时,才使用 shell
shell: process.platform === 'win32'
});