【问题标题】:NPM run parallel task, but wait until resource is available to run second taskNPM 运行并行任务,但要等到资源可用才能运行第二个任务
【发布时间】:2018-03-18 11:04:43
【问题描述】:

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

示例(概念):

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

有什么想法吗?

编辑

举个例子:假设我的第一个任务是启动一个网络服务器,我的第二个任务是在每次事件发生时使用来自该网络服务器的数据。另一个例子:我的第一个任务可能是启动 webdriver-manager,我的第二个任务是启动一个网络服务器,而我的第三个任务是在我的文件更改时运行 e2e 测试。所以,我需要所有这些任务保持并发运行,但它们需要按照特定的顺序和时间进行初始化。

【问题讨论】:

  • 这听起来像是一份承诺!
  • 我让我的概念示例看起来像 Promise。但据我所知,npm 内联脚本无法运行承诺
  • 我今天最好不要再使用 stackoverflow - 我完全误解了你的问题,并认为你在问如何在代码中而不是 npm 中做到这一点。

标签: node.js npm nodes npm-scripts


【解决方案1】:

您可以尝试使用 concurrentlywait-on 包来管理并发/顺序脚本和输出。 等待顺序启动支持头部响应状态、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)。

【讨论】:

    【解决方案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 将运行。

    如果&& 运算符的左侧由于某种原因失败,(即以非零代码/状态退出),右侧的后续任务将失败跑步。例如;如果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/whatever 会忽略它)。 parallelshell 不会忽略它,并会以第一个非零退出代码退出。


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

    假设您想并行/同时运行task1task2,然后仅在task1task2 都成功完成后运行task3

    要实现这一点,您可以同时使用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

    【讨论】:

    • 实际上,这些都不能满足我的需求。我用两个例子编辑了这篇文章,以便更好地理解。
    • 无论如何,您的回答都很棒。我投票给你以表示感谢
    • 谢谢安德烈 - 根据您编辑中提供的示例用例concurrently 可能是您正在寻找的?查看更新/编辑的答案。
    • 并发不会等到一个任务的资源可用,所以实际上不是我需要的答案:(
    • 仅供参考,stackoverflow.com/a/58782760/539472 确保运行 parallelshell 版本 3.0.1 以避免在链接中提供。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多