web-dev-qa-db-ja.com

NPMは並列タスクを実行しますが、2番目のタスクを実行するためのリソースが利用可能になるまで待機します

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に感謝します( ソース )。

8
Burrich

私はあなたの要件を完全に理解しているかどうかわからないので、いくつかの可能な解決策を提供します。

タスクを順番に実行したい場合がありますが(以下の最初の解決策)、投稿で並列について言及しています。


1.タスクを順番に実行する

npm-scriptsは、bashシェルで通常使用される&&演算子をサポートします。ただし、&&で使用される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が失敗した場合、task2およびtask3は実行されません。


2.タスクを同時に実行する

npm-scriptsは、タスクを同時に実行するための単一の&オペレータークロスプラットフォームもサポートします。

&演算子を使用した疑似例:

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

この例では、double &&演算子とsingle&演算子の主な違いは、シングル&の左側が失敗した場合、右側が関係なく実行されることです。例えば; 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がゼロ以外の終了コードで終了する場合、これはシェルの結果に影響しません(つまり、失敗する可能性があり、npm/bash /何でもそれを無視します)。 parallelshellはそれを無視せず、最初のゼロ以外の終了コードで終了します。


4.タスクを並行して順次実行します。

task1task2を並行して/同時に実行し、task3task1の両方が正常に完了した場合にのみtask2を実行するとします。

これを実現するには、parallelshell組み込み&&演算子の両方を利用できます。

タスクを連鎖させるためにparallelshell&&演算子を使用した疑似例:

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

[〜#〜]編集[〜#〜]

次のOPの更新/編集に基づくソリューション:

別の例:最初のタスクはwebdriver-managerの起動、2番目のタスクはWebサーバーの起動、3番目のタスクはファイルが変更されるたびにe2eテストを実行することです。したがって、これらすべてのタスクを同時に実行し続ける必要がありますが、特定の順序と時間で初期化する必要があります。

5.タスクを同時に実行します。

同時に タスクを同時に実行するために利用できます:

$ npm i -D concurrently

concurrentlyを使用した疑似例:

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

この例では、すべてのタスク(1,2、および3)を同時に実行し続け、指定された順序で開始します。ユースケースの例で言及されているツールの詳細はよくわかりませんが、この投稿で提供されているすべての例を必要に応じて組み合わせて、正確な要件を満たすことができます。

concurrentlyにもいくつかの便利な options があります。

3
RobC