我怎样才能并行运行多个NPM脚本?

在我的package.json我有这两个脚本:

  "scripts": { "start-watch": "nodemon run-babel index.js", "wp-server": "webpack-dev-server", } 

每当我开始在Node.js中开发时,我必须并行运行这两个脚本。 我想到的第一件事就是添加这样的第三个脚本:

 "dev": "npm run start-watch && npm run wp-server" 

…但是在运行wp-server之前会等待start-watch

我怎样才能平行运行? 请记住,我需要看到这些命令的output 。 另外,如果你的解决scheme涉及到构build工具,我宁愿使用gulp而不是grunt因为我已经在另一个项目中使用它了。

使用同时调用的包。

npm i concurrently --save-dev

然后设置你的npm run dev任务如下:

 "dev": "concurrently --kill-others \"npm run start-watch\" \"npm run wp-server\"" 

使用Concurrently包可以工作,但不需要它来完成这个工作。 您可以在基于UNIX的机器上使用pipe道来运行并发任务。 我会build议这个方法在另一个,因为它节省了您不必添加额外的依赖。

 "dev": "npm run start-watch | npm run wp-server" 

如果您使用的是类UNIX环境,请使用&作为分隔符:

 "dev": "npm run start-watch & npm run wp-server" 

否则,如果您对跨平台解决scheme感兴趣,可以使用npm-run-all模块:

 "dev": "npm-run-all --parallel start-watch wp-server" 

从Windows cmd你可以使用start

 "dev": "start npm run start-watch && start npm run wp-server" 

以这种方式发起的每一个命令都从自己的窗口开始

你应该使用npm-run-all (或者concurrently parallelshell ),因为它对启动和查杀命令有更多的控制权。 操作符& ,`| 是不好的想法,因为在所有testing完成之后,您需要手动停止它。

这是通过npm进行量angular器testing的一个例子:

 scripts: { "webdriver-start": "./node_modules/protractor/bin/webdriver-manager update && ./node_modules/protractor/bin/webdriver-manager start", "protractor": "./node_modules/protractor/bin/protractor ./tests/protractor.conf.js", "http-server": "./node_modules/http-server/bin/http-server -a localhost -p 8000", "test": "npm-run-all -p -r webdriver-start http-server protractor" } 

-p =并行运行命令。

-r =杀死所有的命令,当他们中的一个完成零。

运行npm run test将启动Selenium驱动程序,启动http服务器(为您提供文件)并运行量angular器testing。 一旦所有testing完成,它将closureshttp服务器和selenium驱动程序。

更好的解决scheme是使用&

 "dev": "npm run start-watch & npm run wp-server" 

我已经检查了几乎所有的解决scheme,只有npm-run-all才能解决所有问题。 比其他解决scheme的主要优点是能够使用参数运行脚本 。

 { "test:static-server": "cross-env NODE_ENV=test node server/testsServer.js", "test:jest": "cross-env NODE_ENV=test jest", "test": "run-p test:static-server \"test:jest -- {*}\" --", "test:coverage": "npm run test -- --coverage", "test:watch": "npm run test -- --watchAll", } 

注意run-pnpm-run-all --paraller快捷方式

这允许我运行命令,如npm run test:watch -- Something

编辑:

对于npm-run-all还有一个更有用的选项 :

  -r, --race - - - - - - - Set the flag to kill all tasks when a task finished with zero. This option is valid only with 'parallel' option. 

-r添加到您的npm-run-all脚本中,以在代码0结束时npm-run-all所有进程。 这在运行HTTP服务器和使用服务器的其他脚本时特别有用。

  "test": "run-p -r test:static-server \"test:jest -- {*}\" --", 

如果使用单个&符号replace双连字符,则脚本将同时运行。

快速解决scheme

在这种情况下,我会说最好的select 如果这个脚本是用于一个私人模块的,只能在基于nix的机器上运行 ,你可以使用控制运算符来分支进程,如下所示:

在部分package.json文件中做这个的一个例子:

 { "name": "npm-scripts-forking-example", "scripts": { "bundle": "watchify -vd -p browserify-hmr index.js -o bundle.js", "serve": "http-server -c 1 -a localhost", "serve-bundle": "npm run bundle & npm run serve &" } 

然后你可以通过npm run serve-bundle并行地执行它们。 您可以增强脚本以将分叉进程的pid输出到文件中,如下所示:

 "serve-bundle": "npm run bundle & echo \"$!\" > build/bundle.pid && npm run serve & echo \"$!\" > build/serve.pid && npm run open-browser", 

谷歌像bash控制操作员分叉学习更多的如何工作。 在下面的Node项目中,我还提供了一些关于利用Unix技术的进一步的上下文:

更多的上下文RE:Unix Tools&Node.js

如果您不在Windows上,Unix工具/技术通常可以很好地实现Node脚本,因为:

  1. 大部分的Node.js都非常模仿Unix的原则
  2. 你正在使用* nix(包括OS X),而NPM正在使用一个shell

系统任务在Nodeland中的模块通常也是Unix工具的抽象或近似,从fsstreams

我遇到了&|问题 ,分别退出状态和错误抛出。

其他解决scheme想要运行任何具有给定名称的任务,如npm-run-all,这不是我的用例。

所以我创build了npm-run-parallel ,它asynchronous地运行npm脚本,并在完成后报告。

所以,对于你的脚本,这将是:

npm-run-parallel wp-server start-watch

我有一个跨平台的解决scheme,没有任何额外的模块。 我正在寻找类似try catch块的东西,我可以在cmd.exe和bash中使用它们。

解决scheme是command1 || command2 command1 || command2似乎在两个环境中工作一样。 所以OP的解决scheme是:

 "scripts": { "start-watch": "nodemon run-babel index.js", "wp-server": "webpack-dev-server", // first command is for the cmd.exe, second one is for the bash "dev": "(start npm run start-watch && start npm run wp-server) || (npm run start-watch & npm run wp-server)", "start": "npm run dev" } 

然后,简单的npm start (和npm run dev )将在所有平台上运行!