2015-01-06 3 views
6

npmスクリプトを使用していますが、私はそれらをいくつか並列に実行する必要があります。私は次のようなものを持っています:npmスクリプトをバックグラウンドで自動的に実行する方法を停止するには

... 
scripts: { 
    "a": "taskA &", 
    "preb": "npm run a", 
    "b": "taskB" 
} 
... 

これは問題ありません!しかし、私はtaskBが終了した後、自動的にtaskAをバックグラウンドで実行して殺したいと思っています。

どうすればいいですか? ありがとう!

答えて

14

npmはプロセス間の複雑な関係を管理するのに最適なツールだとは思いません。

ノードのchild_processモジュールを使用して、おそらくspawnを使用して、コプロセスの起動と終了を管理するノードスクリプトを作成するほうがはるかに優れています。

は( bashシェルを想定している)のような

あなたのNPMスクリプトを構築することができ...ということで、常に直接、使用可能な答えを提供しようとしているの精神で言った:

scripts:{ 
    runBoth: "npm runA & npm runB",  // run tasks A and B in parallel 
    runA: "taskA & TASKA_PID=$!", // run task A and capture its PID into $TASKA_PID 
    runB: "taskB && kill $TASKA_PID" // run task B and if it completes successfully, kill task A using its saved PID 
} 

ここでの唯一の「魔法は」それは次のようになります。

  1. あなたがトンを使用してバックグラウンドでコマンドを実行すると彼bashシェル(最後に&を追加するとどうなりますか)は、コマンドが実行された直後に$!を使用してPIDを検出できます。 (その説明のためのAdvanced Bash-Scripting Guide: Chapter 9. Another Look at Variables - 9.1. Internal Variablesを参照してください。)
  2. taskB 必見コールprocess.exit(0)失敗の成功またはprocess.exit(-1)に&&テストが正しく処理されるようになっています。 (詳細についてはthis answerを参照してください。)npm-run-allパッケージには、あなたが探しているものかもしれ
+0

このBashのトリックをありがとうございました!すばらしい。あなたの答えは、私が探していたものです。 – franleplant

+2

私はrunBがrunAから$ TASK_PIDにアクセスできるとは思わない。 – nathancahill

+0

私のために働かない。 – prongs

0

"scripts": { 
    "runA": "taskA", 
    "runB": "taskB", 
    "runBoth": "npm-run-all -p runA runB" 
} 

-pはそれらを実行します:あなたのpackage.jsonファイルで次に

$ npm install --save npm-run-all 

並行して-sを使用してください)

関連する問題