NPM运行并行任务,但等到资源可用于运行第二个任务

And*_*ira 8 nodes node.js npm npm-scripts

在npm中,如何运行两个或多个并行任务,但是等待第一个任务将创建的资源可供第二个任务使用,等等?

例子(概念):

npm run task1 & waitfor task1 then task2 & waitFor task3 then task4 ...
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑

作为一个例子:让我们说我的第一个任务是启动一个网络服务器,而我的第二个任务是每次事件发生时都从该网络服务器中消耗数据.另一个例子:我的第一个任务可能是启动webdriver-manager,我的第二个任务,启动一个网络服务器,以及我的第三个任务,运行e2e测试我的文件被更改的时间.因此,我需要所有这些任务保持并发运行,但它们需要按特定的顺序和时间进行初始化.

Bur*_*ich 8

您可以与wait-on同时尝试以管理concicurent/sequential脚本和输出.等待顺序启动支持头部响应状态,tcp监听,...

例如 :

"scripts": {
    "start": "concurrently -k -n \"DB,API,WEB\" -c \"blue,magenta,yellow\" \"npm run start-db\" \"npm run start-api\" \"npm run start-web\"",
    "start-db": "myDbServerCmd",
    "start-api": "wait-on tcp:27017 && myApiServerCmd",
    "start-web": "myFrontServerCmd",
}
Run Code Online (Sandbox Code Playgroud)

感谢dchambers的想法(来源).


Rob*_*obC 6

我不确定我是否完全理解您的要求,因此我将提供一些可能的解决方案。

可能是您想要按顺序运行任务(下面的第一个解决方案),但是在您的帖子中您提到了并行。


1. 依次运行任务

npm-scripts支持&&通常在 bash shell 中使用的运算符。然而&&,在 中使用的运算符npm-scripts确实可以成功地跨平台工作。

使用&&运算符链接任务的伪示例:

"scripts": {
    "foo": "npm run task1 && npm run task2 && npm run task3"
},
Run Code Online (Sandbox Code Playgroud)

$ npm run foo使用上面的示例通过 CLI运行...

  1. 最初运行task1.
  2. task1已成功完成(即task1为零的状态退出),然后task2将运行。
  3. task2已经成功完成,然后task3将会运行。

如果&&运算符的左侧由于某种原因失败(即它以非零代码/状态退出),右侧的后续任务将无法运行。例如; 如果task1失败task2task3则不会运行。


2. 同时运行任务

npm-scripts还支持单&操作员跨平台同时运行任务。

使用&运算符的伪示例:

"scripts": {
    "foo": "npm run task1 & npm run task2 & npm run task3"
},
Run Code Online (Sandbox Code Playgroud)

在此示例中,double运算符&&和 single&运算符之间的主要区别在于,如果single的左侧&失败,则无论如何右侧都会运行。例如; 如果task1失败则task2仍然运行。


3. 并行运行任务。

要并行运行任务,我建议您使用parallelshell

$ npm i -D parallelshell

伪示例使用parallelshell

"scripts": {
    "foo": "parallelshell \"npm run task1\" \"npm run task2\" \"npm run task3\""
},
Run Code Online (Sandbox Code Playgroud)

此示例最初看起来与使用&上一节中显示的单个运算符非常相似,但是它提供了文档中列出的其他好处。主要好处(IMO)是:

如果 command1 或 command2 以非零退出代码退出,那么这不会影响您的 shell 的结果(即它们可能会失败并且 npm/bash/whatever 将忽略它)。parallelshell 不会忽略它,并会以第一个非零退出代码退出。


4. 并行和顺序运行任务。

比方说,你要运行task1task2并行/同步,然后运行task3仅当task1task2已成功完成。

为此,您可以同时使用parallelshell内置 &&运算符。

使用parallelshell&&操作符链接任务的伪示例:

"scripts": {
    "foo": "parallelshell \"npm run task1\" \"npm run task2\" && npm run task3"
},
Run Code Online (Sandbox Code Playgroud)

编辑

基于以下 OP 更新/编辑的解决方案:

另一个例子:我的第一个任务可能是启动 webdriver-manager,我的第二个任务是启动一个网络服务器,我的第三个任务是每次我的文件被更改时运行 e2e 测试。所以,我需要所有这些任务保持并发运行,但它们需要以特定的顺序和时间进行初始化。

5. 并发运行任务。

concurrently可用于并发运行任务:

$ npm i -D concurrently

伪示例使用concurrently

"scripts": {
    "foo":  "concurrently \"npm run task1\" \"npm run task2\" \"npm run task3\""
},
Run Code Online (Sandbox Code Playgroud)

此示例将使所有任务(1、2 和 3)同时运行,并且它们将按指定的顺序启动。我不太了解您的示例用例中提到的工具的足够详细信息,但是可以根据需要组合本文中提供的所有示例以满足您的确切要求。

concurrently也有几个有用的选项