如何并行运行多个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"

...但这将等待start-watch完成再运行wp-server

如何并行运行它们?请记住,我需要查看output以下命令。另外,如果您的解决方案涉及构建工具,则我宁愿使用gulpgrunt因为我已经在另一个项目中使用了它。

TomTony2020/03/12 16:52:53

我一直在使用npm-run-all一段时间,但是我从未与之相处,因为在监视模式下命令的输出不能很好地协同工作。例如,如果我启动create-react-appjest处于监视模式,则只能看到我运行的最后一条命令的输出。所以大多数时候,我都是手动运行所有命令...

这就是为什么我实现自己的lib 运行屏幕它仍然是一个非常年轻的项目(从昨天开始:p),但是值得一看,在您的情况下,它将是:

run-screen "npm run start-watch" "npm run wp-server"

然后按数字键1查看的输出,wp-server然后按0查看的输出start-watch

神无村村2020/03/12 16:52:53

我的解决方案与Piittis相似,尽管使用Windows时遇到了一些问题。所以我必须验证win32。

const { spawn } = require("child_process");

function logData(data) {
    console.info(`stdout: ${data}`);
}

function runProcess(target) {
    let command = "npm";
    if (process.platform === "win32") {
        command = "npm.cmd"; // I shit you not
    }
    const myProcess = spawn(command, ["run", target]); // npm run server

    myProcess.stdout.on("data", logData);
    myProcess.stderr.on("data", logData);
}

(() => {
    runProcess("server"); // package json script
    runProcess("client");
})();
StafanHarry2020/03/12 16:52:53

就我而言,我有两个项目,一个是UI,另一个是API两个项目在各自的package.json文件中都有自己的脚本

所以,这就是我所做的。

npm run --prefix react start&  npm run --prefix express start&
米亚JinJin樱2020/03/12 16:52:53

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

其他解决方案希望以给定名称运行任何任务,例如npm-run-all,这不是我的用例。

因此,我创建了npm-run-parallel,它异步运行npm脚本并在完成后报告。

因此,对于您的脚本,将是:

npm-run-parallel wp-server start-watch

TomL2020/03/12 16:52:53
npm-run-all --parallel task1 task2

编辑:

您需要事先安装npm-run-all另请检查此页面以了解其他使用情况。

Cathy2020/03/12 16:52:53

快速解决方案

在这种情况下,最好的选择是 如果此脚本用于仅在基于* 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",

Google像bash控制运算符之类的东西,用于分叉以了解其工作原理的更多信息。我还在下面的Node项目中提供了有关利用Unix技术的更多信息:

进一步的内容RE:Unix工具和Node.js

如果您不在Windows上,则Unix工具/技术通常可以很好地使用Node脚本来实现某些目标,因为:

  1. 许多Node.js都非常喜欢Unix原则
  2. 您正在使用* nix(包括OS X),并且NPM仍在使用Shell

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

Jim老丝猪猪2020/03/12 16:52:53

我有一个没有任何其他模块跨平台解决方案我一直在寻找可以在cmd.exe和bash中同时使用的try catch块之类的东西。

解决方案command1 || command2似乎在两个环境中都相同。因此,OP的解决方案是:

"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)将在所有平台上工作!

神奇小小2020/03/12 16:52:53

如果将双“与”号替换为单个“与”号,则脚本将同时运行。

凯梅小胖2020/03/12 16:52:53

使用并发调用的包

npm i concurrently --save-dev

然后按以下步骤设置您的npm run dev任务:

"dev": "concurrently --kill-others \"npm run start-watch\" \"npm run wp-server\""
路易Itachi小小2020/03/12 16:52:53

如果您使用的是类似UNIX的环境,则只需将其&用作分隔符即可:

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

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

"dev": "npm-run-all --parallel start-watch wp-server"
Itachi蛋蛋2020/03/12 16:52:53

更好的解决方案是使用 &

"dev": "npm run start-watch & npm run wp-server"
十三Harry神无2020/03/12 16:52:53

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

这是通过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驱动程序。

Pro番长2020/03/12 16:52:53

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

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

参考链接

EvaPro2020/03/12 16:52:53

在Windows cmd中,您可以使用start

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

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