在npm中,如何运行两个或多个并行任务,但是等待第一个任务将创建的资源可供第二个任务使用,等等?
示例(概念):
npm run task1 & waitfor task1 then task2 & waitFor task3 then task4 ...
任何想法?
修改
作为一个例子:让我们说我的第一个任务是启动一个网络服务器,而我的第二个任务是每次事件发生时都从该网络服务器中消耗数据。另一个例子:我的第一个任务可能是启动webdriver-manager,我的第二个任务,启动一个网络服务器,以及我的第三个任务,运行e2e测试我的文件被更改的时间。因此,我需要所有这些任务同时保持运行,但它们需要按特定的顺序和时间进行初始化。
答案 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)
我不确定我是否完全理解您的要求,因此我将提供一些可能的解决方案。
您可能希望按顺序运行任务(下面的第一个解决方案),但是在您的帖子中提到并行。
npm-scripts
支持通常在bash shell中使用的&&
运算符。然而,&&
中使用的npm-scripts
运算符可以跨平台成功运行。
使用&&
运算符进行链接任务的伪示例:
"scripts": {
"foo": "npm run task1 && npm run task2 && npm run task3"
},
使用上面的示例通过CLI运行$ npm run foo
...
task1
。task1
成功完成(例如task1
退出且状态为零)时,将运行task2
。task2
后,将运行task3
。如果&&
运算符的左侧因任何原因失败,(即它以非零代码/状态退出),右侧的后续任务将无法运行。例如;如果task1
失败,则task2
和task3
将无法运行。
npm-scripts
还支持单&
运营商跨平台同时运行任务。
使用&
运算符的伪示例:
"scripts": {
"foo": "npm run task1 & npm run task2 & npm run task3"
},
在此示例中,双&&
和单&
运算符之间的主要区别在于,如果单&
的左侧失败,则右侧无论如何都会运行。例如;如果task1
失败,则task2
仍会运行。
要并行运行任务,我建议您使用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不会忽略它,并将退出第一个非零退出代码。
假设您要同时并行/同时运行task1
和task2
,只有在task3
和task1
成功完成后才能运行task2
。
要实现此目的,您可以同时使用parallelshell
和内置 &&
运算符。
使用parallelshell
和&&
运算符进行链接任务的伪示例:
"scripts": {
"foo": "parallelshell \"npm run task1\" \"npm run task2\" && npm run task3"
},
修改强>
基于以下OP更新/编辑的解决方案:
另一个例子:我的第一个任务可能是启动webdriver-manager,我的第二个任务,启动一个网络服务器,以及我的第三个任务,运行e2e测试我的文件被更改的时间。因此,我需要所有这些任务同时保持运行,但它们需要按特定的顺序和时间进行初始化。
concurrently可用于同时运行任务:
$ npm i -D concurrently
使用concurrently
的伪示例:
"scripts": {
"foo": "concurrently \"npm run task1\" \"npm run task2\" \"npm run task3\""
},
此示例将使所有任务(1,2和3)同时运行,并且它们将按指定的顺序启动。我不清楚您的示例用例中提到的工具的详细信息,但是本文中提供的所有示例都可以根据您的具体要求进行组合。
concurrently
也有一些有用的options。