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

时间:2017-10-06 15:28:24

标签: node.js npm nodes npm-scripts

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

示例(概念):

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

任何想法?

修改

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

2 个答案:

答案 0 :(得分:7)

您可以使用concurrently包尝试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",
}

感谢dchambers提出的想法(source)。

答案 1 :(得分:2)

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

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

1。按顺序运行任务

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

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

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

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

  1. 最初运行task1
  2. task1成功完成(例如task1退出且状态为零)时,将运行task2
  3. 成功完成task2后,将运行task3
  4. 如果&&运算符的左侧因任何原因失败,(即它以非零代码/状态退出),右侧的后续任务将无法运行。例如;如果task1失败,则task2task3将无法运行。

    2。同时运行任务

    npm-scripts还支持单&运营商跨平台同时运行任务。

    使用&运算符的伪示例:

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

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

    3。并行运行任务。

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

    $ npm i -D parallelshell

    使用parallelshell的伪示例:

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

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

      

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

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

    假设您要同时并行/同时运行task1task2,只有在task3task1成功完成后才能运行task2

    要实现此目的,您可以同时使用parallelshell内置 &&运算符。

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

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

    修改

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

      

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

    5。同时运行任务。

    concurrently可用于同时运行任务:

    $ npm i -D concurrently

    使用concurrently的伪示例:

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

    此示例将使所有任务(1,2和3)同时运行,并且它们将按指定的顺序启动。我不清楚您的示例用例中提到的工具的详细信息,但是本文中提供的所有示例都可以根据您的具体要求进行组合。

    concurrently也有一些有用的options