我怎样才能并行运行多个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-p
是npm-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脚本,因为:
- 大部分的Node.js都非常模仿Unix的原则
- 你正在使用* nix(包括OS X),而NPM正在使用一个shell
系统任务在Nodeland中的模块通常也是Unix工具的抽象或近似,从fs
到streams
。
我遇到了&
和|
问题 ,分别退出状态和错误抛出。
其他解决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
)将在所有平台上运行!