Npmで、2つ以上の並列タスクを実行するにはどうすればよいですか。ただし、最初のタスクが作成するリソースが2番目のタスクで使用できるようになるのを待つなどです。
例(概念):
npm run task1 & waitfor task1 then task2 & waitFor task3 then task4 ...
何か案は?
[〜#〜]編集[〜#〜]
例として:最初のタスクがWebサーバーの起動であり、2番目のタスクがイベントが発生するたびにそのWebサーバーからデータを消費するとします。別の例:最初のタスクはwebdriver-managerの起動、2番目のタスクはWebサーバーの起動、3番目のタスクはファイルが変更されるたびにe2eテストを実行することです。したがって、これらすべてのタスクを同時に実行し続ける必要がありますが、特定の順序と時間で初期化する必要があります。
同時/順次スクリプトと出力を管理するために、 concurrently with wait-on パッケージを試すことができます。 wait-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に感謝します( ソース )。
私はあなたの要件を完全に理解しているかどうかわからないので、いくつかの可能な解決策を提供します。
タスクを順番に実行したい場合がありますが(以下の最初の解決策)、投稿で並列について言及しています。
npm-scripts
は、bashシェルで通常使用される&&
演算子をサポートします。ただし、&&
で使用される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"
},
この例では、double &&
演算子とsingle&
演算子の主な違いは、シングル&
の左側が失敗した場合、右側が関係なく実行されることです。例えば; task1
が失敗した場合でも、task2
は実行されます。
タスクを並行して実行するには、 parallelshell :を利用することをお勧めします。
$ npm i -D parallelshell
parallelshell
を使用した疑似例:
"scripts": {
"foo": "parallelshell \"npm run task1\" \"npm run task2\" \"npm run task3\""
},
この例は、最初は前のセクションで示した単一の&
演算子を使用するのと非常に似ているように見えますが、 documentation にリストされている追加の利点があります。主な利点(IMO)は次のとおりです。
Command1またはcommand2がゼロ以外の終了コードで終了する場合、これはシェルの結果に影響しません(つまり、失敗する可能性があり、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の起動、2番目のタスクはWebサーバーの起動、3番目のタスクはファイルが変更されるたびにe2eテストを実行することです。したがって、これらすべてのタスクを同時に実行し続ける必要がありますが、特定の順序と時間で初期化する必要があります。
同時に タスクを同時に実行するために利用できます:
$ npm i -D concurrently
concurrently
を使用した疑似例:
"scripts": {
"foo": "concurrently \"npm run task1\" \"npm run task2\" \"npm run task3\""
},
この例では、すべてのタスク(1,2、および3)を同時に実行し続け、指定された順序で開始します。ユースケースの例で言及されているツールの詳細はよくわかりませんが、この投稿で提供されているすべての例を必要に応じて組み合わせて、正確な要件を満たすことができます。
concurrently
にもいくつかの便利な options があります。