如何并行运行多个 npm 脚本?

IT技术 javascript node.js build
2021-01-31 19:24:33

在我的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"

...但这将start-watch在运行之前等待完成wp-server

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

6个回答

使用名为concurrently的包

npm i concurrently --save-dev

然后这样设置你的npm run dev任务:

"dev": "concurrently --kill-others \"npm run start-watch\" \"npm run wp-server\""
我们必须有更好的方法来管理 Javascript 构建/运行脚本。这个平台的所有东西似乎都固定在一起。带有转义引号的引号和 npm 构建以调用其他 'npm run' 构建.. 这变得非常痛苦。
2021-03-12 19:24:33
@StijndeWitt 同时提到的错误现已在2.0.0 版本中修复您可以使用--rawmode 来保留输出中的颜色。
2021-03-16 19:24:33
@StijndeWitt parallelshell 已被弃用,取而代之的是 npm-run-all github.com/keithamus/...
2021-03-25 19:24:33
node ./node_modules/concurrently/src/main.js不需要。 concurrent将在脚本中正常工作,因为该module安装了一个 bin./node_modules/.bin/concurrent
2021-03-31 19:24:33
还有parallelshell我实际上建议concurrently使用多个流来干扰控制台输出(颜色可能变得奇怪,光标消失)而parallelshell没有那个问题
2021-04-01 19:24:33

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

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

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

"dev": "npm-run-all --parallel start-watch wp-server"
a && b成功完成b启动a,但 nodemon 永远不会无错误地停止,因此无法正常工作。 a & b开始a,将其移动到后台并立即开始b赢!a | b将标准输出的标准输出通过管道a传输到标准输入b需要两者同时运行。尽管这似乎具有预期的效果,但您不应在此处使用它。
2021-03-12 19:24:33
@KamilTomšík&是一个非常糟糕的主意,因为它分离了流程。这意味着它npm不再是父进程。你最终会得到一个npm run start-watch不会被杀死的僵尸ctrl-c
2021-03-16 19:24:33
我这样做 - 不时地当我“ctrl-c”npm 时,命令会一直挂在后台......有什么想法吗?
2021-03-19 19:24:33
只需添加wait以减轻挂起进程的问题:"dev": "npm run start-watch & npm run wp-server & wait"
2021-03-20 19:24:33
这不是僵尸。但是&在 unix 上阻止命令响应 Cc/Cz 并且还阻止它的返回代码在失败的情况下传播。
2021-04-03 19:24:33

从 windows cmd 你可以使用start

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

以这种方式启动的每个命令都在其自己的窗口中启动。

完美解决!我喜欢它启动新窗口。非常适合 VS2015 package.json 需求
2021-03-10 19:24:33
如果您有观察者任务,这将不起作用,因为&&在启动第二个命令之前等待第一个命令完成并且观察者任务永远不会完成。
2021-03-18 19:24:33
这也意味着我必须在您的项目上使用 Windows 工作。
2021-03-20 19:24:33
@BennyNeugebauer 命令前面是“开始”命令,它为每个命令打开一个新的命令行。一开始我也很困惑,因为我认为“使用 && 运算符不起作用”。这个解决方案非常简单,不需要开发人员提供额外的包/工作。
2021-03-22 19:24:33
这是错误的。命令将按顺序运行。在 Windows 上,您必须使用插件才能同时运行命令。
2021-04-08 19:24:33

您应该使用npm-run-all(或concurrently, parallelshell),因为它可以更好地控制启动和终止命令。运营商&|是坏的想法,因为你需要手动停止所有的测试都完成之后。

这是通过 npm 进行量角器测试的示例:

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 服务器(为您提供文件)并运行量角器测试。完成所有测试后,它将关闭 http 服务器和 selenium 驱动程序。

不过,我想知道这如何正确运行测试。虽然 webdriver-start 和 http-server 可以并行运行,但量角器任务应该只在前两个之后运行。
2021-04-02 19:24:33
@asenovm 对于依赖于订单的任务,为什么不直接使用gulpand gulp-sync
2021-04-03 19:24:33

您可以将一个&用于并行运行脚本

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

参考链接

4 年前发布了相同的答案,但获得的票数比这少。此外,已经充分讨论了为什么这种方法是一个坏主意。嗯,为什么还有这么多赞成票?
2021-03-12 19:24:33
@MartinBraun 快速简便
2021-03-21 19:24:33
@BenisonSam 我在我的 Windows 电脑上尝试过,即使使用单个“&”它也不会运行第二个命令
2021-03-26 19:24:33
tnx - 这就是答案 - 所有其他提到的解决方案都是矫枉过正
2021-03-31 19:24:33
这也适用于 Windows 吗?抱歉,我对 node 还很陌生,我不知道如何验证这一点!
2021-04-05 19:24:33