And*_*ira 8 nodes node.js npm npm-scripts
在npm中,如何运行两个或多个并行任务,但是等待第一个任务将创建的资源可供第二个任务使用,等等?
例子(概念):
npm run task1 & waitfor task1 then task2 & waitFor task3 then task4 ...
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑
作为一个例子:让我们说我的第一个任务是启动一个网络服务器,而我的第二个任务是每次事件发生时都从该网络服务器中消耗数据.另一个例子:我的第一个任务可能是启动webdriver-manager,我的第二个任务,启动一个网络服务器,以及我的第三个任务,运行e2e测试我的文件被更改的时间.因此,我需要所有这些任务保持并发运行,但它们需要按特定的顺序和时间进行初始化.
您可以与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",
}
Run Code Online (Sandbox Code Playgroud)
感谢dchambers的想法(来源).
我不确定我是否完全理解您的要求,因此我将提供一些可能的解决方案。
可能是您想要按顺序运行任务(下面的第一个解决方案),但是在您的帖子中您提到了并行。
npm-scripts支持&&通常在 bash shell 中使用的运算符。然而&&,在 中使用的运算符npm-scripts确实可以成功地跨平台工作。
使用&&运算符链接任务的伪示例:
"scripts": {
"foo": "npm run task1 && npm run task2 && npm run task3"
},
Run Code Online (Sandbox Code Playgroud)
$ npm run foo使用上面的示例通过 CLI运行...
task1.task1已成功完成(即task1为零的状态退出),然后task2将运行。task2已经成功完成,然后task3将会运行。如果&&运算符的左侧由于某种原因失败(即它以非零代码/状态退出),右侧的后续任务将无法运行。例如; 如果task1失败task2,task3则不会运行。
npm-scripts还支持单&操作员跨平台同时运行任务。
使用&运算符的伪示例:
"scripts": {
"foo": "npm run task1 & npm run task2 & npm run task3"
},
Run Code Online (Sandbox Code Playgroud)
在此示例中,double运算符&&和 single&运算符之间的主要区别在于,如果single的左侧&失败,则无论如何右侧都会运行。例如; 如果task1失败则task2仍然运行。
要并行运行任务,我建议您使用parallelshell:
$ npm i -D parallelshell
伪示例使用parallelshell:
"scripts": {
"foo": "parallelshell \"npm run task1\" \"npm run task2\" \"npm run task3\""
},
Run Code Online (Sandbox Code Playgroud)
此示例最初看起来与使用&上一节中显示的单个运算符非常相似,但是它提供了文档中列出的其他好处。主要好处(IMO)是:
如果 command1 或 command2 以非零退出代码退出,那么这不会影响您的 shell 的结果(即它们可能会失败并且 npm/bash/whatever 将忽略它)。parallelshell 不会忽略它,并会以第一个非零退出代码退出。
比方说,你要运行task1和task2并行/同步,然后运行task3仅当task1与task2已成功完成。
为此,您可以同时使用parallelshell和内置 &&运算符。
使用parallelshell和&&操作符链接任务的伪示例:
"scripts": {
"foo": "parallelshell \"npm run task1\" \"npm run task2\" && npm run task3"
},
Run Code Online (Sandbox Code Playgroud)
编辑
基于以下 OP 更新/编辑的解决方案:
另一个例子:我的第一个任务可能是启动 webdriver-manager,我的第二个任务是启动一个网络服务器,我的第三个任务是每次我的文件被更改时运行 e2e 测试。所以,我需要所有这些任务保持并发运行,但它们需要以特定的顺序和时间进行初始化。
concurrently可用于并发运行任务:
$ npm i -D concurrently
伪示例使用concurrently:
"scripts": {
"foo": "concurrently \"npm run task1\" \"npm run task2\" \"npm run task3\""
},
Run Code Online (Sandbox Code Playgroud)
此示例将使所有任务(1、2 和 3)同时运行,并且它们将按指定的顺序启动。我不太了解您的示例用例中提到的工具的足够详细信息,但是可以根据需要组合本文中提供的所有示例以满足您的确切要求。
concurrently也有几个有用的选项。