利用Node.js编写跨平台的spawn语句详解
前言
Node.js是跨平台的,也就是说它能运行在Windows、OSX和Linux平台上。很多Node.js开发者都是在OSX上做开发的,然后再将代码部署到Linux服务器上。由于OSX和Linux都是基于Unix的,因此两者共性很多。Windows也是Node.js官方支持的平台,只要你通过正确的方式写代码,就能在各个平台上毫无压力的跑起来。
Node.js的子进程(child_process)模块下有一spawn函数,可以用于调用系统上的命令,如在Linux,macOS等系统上,我们可以执行
constspawn=require('child_process').spawn; spawn('npm',{ stdio:'inherit' });
来调用npm命令。
然而,同样的语句在Windows上执行则会报错。
Error:spawnnpmENOENT atexports._errnoException(util.js:855:11) atProcess.ChildProcess._handle.onexit(internal/child_process.js:178:32) atonErrorNT(internal/child_process.js:344:16) atnextTickCallbackWith2Args(node.js:455:9) atprocess._tickCallback(node.js:369:17) atFunction.Module.runMain(module.js:432:11) atstartup(node.js:141:18) atnode.js:980:3
因为在Windows上,当我们执行npm时,我们实际执行的是npm.cmd批处理,而在Windows上,.cmd, .bat批处理是无法脱离cmd.exe这一解释器而单独运行的。
因此,我们需要显式地调用cmd
spawn('cmd',['/c','npm'],{ stdio:'inherit' });
或者使用在调用spawn函数时,设置shell选项为true以隐式地调用cmd(该选项添加自Node.jsv6版本)
spawn('npm',{ stdio:'inherit', shell:true });
另外,虽然在Linux,macOS等系统上不需要设置shell选项,命令也能够正常执行;设置shell为true也不会妨碍命令的执行,只是会额外的产生一个本不必要的shell进程,影响性能。
因此,如果想要编写跨平台的spawn命令,而又不想增加额外的开销的话,可以这样写
constprocess=require('process'); const{spawn}=require('child_process'); spawn('npm',{ stdio:'inherit', //仅在当前运行环境为Windows时,才使用shell shell:process.platform==='win32' });
第三方模块cross-spawn
关于spawn函数的跨平台写法,除了自己编写代码的时候做处理,也有第三方模块封装好了相关细节,如cross-spawn。
使用该模块,可以在调用spawn函数时,自动根据当前的运行平台,来决定是否生成一个shell来执行所给的命令。
而且,还能够
- 支持低于v6的Node.js版本(使用shell选项需要至少Node.jsv6);
- 跨平台地支持shebang;
- 对命令和参数中的字符进行转义更为方便。
安装
npminstallcross-spawn
用法
constspawn=require('cross-spawn'); spawn('npm',{ stdio:'inherit' });
参考文档
在Windows上衍生.bat和.cmd文件
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。