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

kx1ctssn  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(133)

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

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

字符串
有什么想法吗?

编辑

例如:假设我的第一个任务是启动一个web服务器,第二个任务是在每次事件发生时从该web服务器消耗数据。另一个例子:我的第一个任务可能是启动webdriver-manager,第二个任务是启动一个web服务器,第三个任务是在每次文件更改时运行e2 e测试。所以,我需要所有这些任务都同时运行,但是它们需要以特定的顺序和时间被初始化。

8tntrjer

8tntrjer1#

您可以尝试concurrentlywait-on软件包,以管理conccurent/顺序脚本和输出。等待顺序启动支持头响应状态,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的想法(来源)。

wwodge7n

wwodge7n2#

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

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

1.按顺序运行任务

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

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

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

字符串
使用上面的示例通过CLI运行$ npm run foo.
1.最初运行task1
1.当task1成功完成 (即task1以零状态退出) 时,task2将运行。
1.当task2成功完成时,task3将运行。
如果&&操作符的左侧由于任何原因失败,(即它以非零代码/状态退出),则右侧的后续任务将无法运行。例如;如果task1失败,则task2task3将不会运行。

2.任务同时运行

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

使用&运算符的伪示例:

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


在这个例子中,double &&和single &运算符之间的主要区别是,如果single &的左边失败,那么右边会运行。例如,如果task1失败,那么task2仍然运行。

3.并行运行任务。

要并行运行任务,我建议您使用parallelshell
$ npm i -D parallelshell

parallelshell伪示例:

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


这个例子最初看起来非常类似于使用上一节中显示的单个&运算符,但是它提供了文档中列出的其他好处。主要好处 (IMO) 是:
如果command 1或command 2以非零退出代码退出,那么这不会影响shell的结果(即它们可能会失败,npm/bash/whatever将忽略它)。

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

假设您希望并行/同时运行task1task2,然后仅在task1task2都成功完成时才运行task3
要实现这一点,您可以使用parallelshell和 * 内置 * &&操作符。

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

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

编辑

基于以下OP的更新/编辑的解决方案:
另一个例子:我的第一个任务可能是启动webdriver-manager,第二个任务是启动一个web服务器,第三个任务是每次文件被更改时运行e2 e测试。所以,我需要所有这些任务同时运行,但它们需要以特定的顺序和时间进行初始化。

5.并发运行任务。

concurrently可用于并发运行任务:
$ npm i -D concurrently

concurrently伪示例:

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


这个例子将保持所有任务 (1,2,3) 并发运行,它们将按照指定的顺序开始。我不知道你的例子用例中提到的工具的足够细节,但是这篇文章中提供的所有例子都可以根据需要组合起来以满足你的确切要求。
concurrently也有一些有用的选项。

vsdwdz23

vsdwdz233#

使用npm-run-all:https://github.com/mysticatea/npm-run-all/blob/HEAD/docs/npm-run-all.md#run-a-mix-of-sequential-and-parallel-scripts
$ npm-run-all clean lint --parallel watch:html watch:js
首先,这将连续/串行地运行干净和lint。
接下来,并行运行watch:html和watch:js。
$npm-运行-所有a B --并行c d --顺序e f --并行g h i

$npm-运行-所有a B --并行c d --串行e f --并行g h i
首先,顺序/串行运行a和B。
第二,并行运行c和d。
第三,顺序/串行运行e和f。
最后,并行运行g、h和i。

相关问题