当前位置:首页 > 日记 > 正文

利用Node.js编写跨平台的spawn语句详解

利用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 等系统上,我们可以执行

const spawn = require('child_process').spawn;spawn('npm', { stdio: 'inherit'});

来调用 npm 命令。

然而,同样的语句在 Windows 上执行则会报错。

Error: spawn npm ENOENT at exports._errnoException (util.js:855:11) at Process.ChildProcess._handle.onexit (internal/child_process.js:178:32) at onErrorNT (internal/child_process.js:344:16) at nextTickCallbackWith2Args (node.js:455:9) at process._tickCallback (node.js:369:17) at Function.Module.runMain (module.js:432:11) at startup (node.js:141:18) at node.js:980:3

因为在 Windows 上,当我们执行 npm 时,我们实际执行的是 npm.cmd 批处理,而在 Windows 上, .cmd,  .bat 批处理是无法脱离 cmd.exe 这一解释器而单独运行的。

因此,我们需要显式地调用 cmd

spawn('cmd', ['/c', 'npm'], { stdio: 'inherit'});

或者使用在调用 spawn 函数时,设置 shell 选项为 true 以隐式地调用 cmd (该选项添加自 Node.js v6 版本)

spawn('npm', { stdio: 'inherit', shell: true});

另外,虽然在 Linux, macOS 等系统上不需要设置 shell 选项,命令也能够正常执行;设置 shell true 也不会妨碍命令的执行,只是会额外的产生一个本不必要的 shell 进程,影响性能。

因此,如果想要编写跨平台的 spawn 命令,而又不想增加额外的开销的话,可以这样写

const process = 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.js v6);
  • 跨平台地支持 shebang;
  • 对命令和参数中的字符进行转义更为方便。

安装

npm install cross-spawn

用法

const spawn = require('cross-spawn');spawn('npm', { stdio: 'inherit'});

参考文档

在 Windows 上衍生 .bat 和 .cmd 文件

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

相关文章

Bootstrap滚动监听组件scrollspy.j

Bootstrap滚动监听组件scrollspy.j

组件,使用方法,详解,电脑软件,Bootstrap,其实滚动监听使用的情况还是很多的,比如导航居于右侧,当主题内容滚动某一块的时候,右侧导航对应的要高亮。实现功能1、当滚动区域内设置的hashkey距离顶点到有效位置时,就关联设置其导航上的指定项2、导…

PS鼠绘一把超逼真的金属质感弯刀

PS鼠绘一把超逼真的金属质感弯刀

弯刀,质感,超逼真,电脑软件,PS,这篇教程教的PS鼠绘学习者们使用PS鼠绘超强质感弯刀,教程主要介绍的使用PS来体现弯刀的金属质感和锋利。对于学习鼠绘的朋友来说还是挺有用的,推荐过来和的朋友们一起分享,一起学习了,我们先来看看最终的效果图:下…

创建一般js对象的几种方式

创建一般js对象的几种方式

对象,几种,方式,电脑软件,js,1.对象字面量创建对象var obj = { a:1,b:2 };注意:对象字面量是一个表达式,这种表达式每次运算都会创建并初始化一个新对象,并计算这个新对象的每个属性值。所以如果在循环体内使用对象字面量,每次循环时都会创建新…

ai怎么绘制多重线条?

ai怎么绘制多重线条?

绘制,多重,线条,电脑软件,ai,AI线条的变化可以绘制出很多的图形,下面我们就来看看简单的例子。软件名称:Adobe Illustrator CS6 (AI cs6) 精简绿色中文版(32位+64位)软件大小:205MB更新时间:2014-05-111、新建一个图层2、选矩形工具画矩形设置…

excel表格怎么设置页数excel表格设

excel表格怎么设置页数excel表格设

设置,步骤,方法,页数,表格,  Excel表格中怎么设置页数,其实这很简单只要你跟着着小编的的步骤来学习,很快学会的。excel表格设置页数的步骤首先点开EXCEL表格,比如说你要写六页纸,就用鼠标圈出六个工作表。然后点击开始,开始里面有框线设置,比…

javascript算法之二叉搜索树的示例

javascript算法之二叉搜索树的示例

算法,示例代码,二叉搜索树,电脑软件,javascript,什么是二叉树二叉树就是树的每个节点最多只能有两个子节点什么是二叉搜索树二叉搜索树在二叉树的基础上,多了一个条件,就是二叉树在插入值时,若插入值比当前节点小,就插入到左节点,否则插入到右节…

NodeJS设计模式总结【单例模式,适

NodeJS设计模式总结【单例模式,适

设计模式,单例模式,装饰模式,适配器模式,观察者模式,本文实例讲述了NodeJS设计模式。分享给大家供大家参考,具体如下:1 . 单例模式顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直接返回,若不存在,则创建实…

WPS文字怎么删除表格后空白页

WPS文字怎么删除表格后空白页

删除表,文字,格后,方法,空白页,  表格后的空白页删不掉让人烦恼,那么表格后的空白页该怎样去掉呢?以下是小编给大家整理的WPS文字去掉表格后空白页的技巧,希望能帮到你!WPS文字删除表格后空白页的方法难道就真的没有办法去掉这可恶的空白页…

Spring AOP的实现原理详解及实例

Spring AOP的实现原理详解及实例

实现原理,详解,实例,电脑软件,Spring,Spring AOP的实现原理详解及实例spring 实现AOP是依赖JDK动态代理和CGLIB代理实现的。以下是JDK动态代理和CGLIB代理简单介绍 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一…

angular2+node.js express打包部署

angular2+node.js express打包部署

实战,电脑软件,node,express,js,Angular2我自己还在摸索学习中,本文介绍了angular2+node.js express打包部署的实战,分享给大家,也给自己留个笔记angular是客户端js,Node.js 是服务端JS,建立SPA 网站需要把这两者统一到一起。1、angular2项目…

怎么样用word绘制表格用word绘制表

怎么样用word绘制表格用word绘制表

绘制,步骤,方法,表格,电脑软件,  word已经普及人们的生活,可以用word来制作个人简历、制作1篇文章、制作1张电子小报亦或是论文等等,下面小编来教大家如何用word绘制1张简单的表格。word绘制表格的步骤这是我绘制的1张简单表格大家只要知道…

怎么恢复excel2010没有保存的文件

怎么恢复excel2010没有保存的文件

文件,恢复,电脑软件,  恢复excel2010没有保存的文件,有时我们太匆忙了,把Excel做到一半的时候我们忘记点击保存,就直接把它给关了,再打开的时候就老是显示不出来了,就没有了。以下是小编为您带来的关于恢复excel2010没有保存的文件,希望对您有…