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

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

示例(概念):

npm run task1 & waitfor task1 then task2 & waitFor task3 then task4 ... 

有任何想法吗?

编辑

举个例子:让我们说我的第一个任务是启动一个web服务器,而我的第二个任务是每次事件发生时都从这个web服务器上获取数据。 另一个例子:我的第一个任务可能是启动webdriver-manager,我的第二个任务,启动一个web服务器,我的第三个任务,运行e2etestingeverty时间我的文件被改变。 所以,我需要所有这些任务保持同时运行,但是需要按照特定的顺序和时间进行初始化。

我不确定我完全理解你的要求,所以我会提供一些可能的解决scheme。

这可能是你想要顺序运行任务(下面的第一个解决scheme),但是在你的post中提到并行。


1.按顺序运行任务

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

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

 "scripts": { "foo": "npm run task1 && npm run task2 && npm run task3" }, 

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

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

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


2.同时运行任务

npm-scripts还支持单个&运算符跨平台同时运行任务。

使用&运算符的伪示例:

 "scripts": { "foo": "npm run task1 & npm run task2 & npm run task3" }, 

在这个例子中,double &&和单个&运算符的主要区别在于,如果单个&的左侧失败,则右侧运行。 例如; 如果task1失败,那么task2仍然运行。


3.并行运行任务。

要并行运行任务,我build议你使用parallelshell :

$ npm i -D parallelshell

使用parallelshell伪示例:

 "scripts": { "foo": "parallelshell \"npm run task1\" \"npm run task2\" \"npm run task3\"" }, 

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

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


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

假设你想要并行/同时运行task3task2 ,然后只有在task3task2都成功完成时才运行task3

为了达到这个目的,你可以使用parallelshell内置的 &&运算符。

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

 "scripts": { "foo": "parallelshell \"npm run task1\" \"npm run task2\" && npm run task3" }, 

编辑

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

另一个例子:我的第一个任务可能是启动webdriver-manager,我的第二个任务,启动一个web服务器,我的第三个任务,运行e2etestingeverty时间我的文件被改变。 所以,我需要所有这些任务保持同时运行,但是需要按照特定的顺序和时间进行初始化。

5.同时运行任务。

同时可以用来同时运行任务:

$ npm i -D concurrently

伪示例concurrently使用:

 "scripts": { "foo": "concurrently \"npm run task1\" \"npm run task2\" \"npm run task3\"" }, 

这个例子将保持所有的任务(1,2和3)同时运行,他们将以指定的顺序开始。 我不太了解您的示例用例中提到的工具的详细信息,但是本文中提供的所有示例都可以根据需要进行组合以满足您的确切要求。

concurrently也有几个有用的选项 。