用 Node 编写跨平台 spawn 语句
本文将会讲述如何跨平台来使用spawn
语句呢?(可以利用cross-spawn
spawn
当我们想要在js
文件中想要调用系统上的命令时,可以利用 Node.js 的子进程(child_process
)模块下的 spawn
函数,(与exec
区别可以查看issue,本文不作介绍),如在 Linux, macOS 等系统上,我们可以执行:
1 | const spawn = require('child_process').spawn; |
来调用 npm
命令。
然而,同样的语句在 Windows 上执行则会报错:
1 | Error: spawn npm ENOENT |
因为在 Windows 上,当我们执行 npm
时,实际执行的是 npm.cmd
批处理,而在 Windows 上,.cmd
, .bat
批处理是无法脱离 cmd.exe
这一解释器而单独运行的。
因此,需要显式地调用 cmd
1 | spawn('cmd', ['/c', 'npm'], { |
或者使用在调用 spawn
函数时,设置 shell
选项为 true
以隐式地调用 cmd
(该选项添加自 Node.js v6 版本)
1 | spawn('npm', { |
另外,虽然在 Linux, macOS 等系统上不需要设置 shell
选项,命令也能够正常执行;设置 shell
为 true
也不会妨碍命令的执行,只是会额外的产生一个本不必要的 shell 进程,影响性能。
因此,如果想要编写跨平台的 spawn 命令,而又不想增加额外的开销的话,可以加个判断:
1 | const process = require('process'); |
cross-spawn
利用 cross-spawn 轻松编写跨平台命令,使用该模块,在调用 spawn
函数时,它会自动根据当前的运行平台,来决定是否生成一个 shell
来执行所给的命令。
如:
1 | const spawn = require('cross-spawn'); |
参考链接
用 Node 编写跨平台 spawn 语句