2015-01-06 13 views
6

npm komut dosyalarını kullanıyorum, bunlardan bazılarının paralel olarak çalışması gerekir. Buna benzer bir şeyim var:Arka planda otomatik olarak çalışan npm komut dosyası nasıl durdurulur

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

Bu doğru! Ama görevB'nin bittikten sonra arka planda çalışan otomatik olarak taskA'yı öldürmek istiyorum.

Bunu nasıl yapabilirim? Teşekkürler!

cevap

14

Npm, süreçler arasındaki karmaşık ilişkileri yönetmenin en iyi aracı olduğuna inanmıyorum.

spawn kullanarak, birlikte işlemlerin başlatılmasını ve öldürülmesini yönetmek için düğümün child_process modülünü kullanan bir düğüm komut dosyası oluşturarak çok daha iyi bir şekilde sunulabilirdiniz.

( bash kabuğunu varsayar) gibi

Sen npm komut yapısı olabilir .. o ve her zaman doğrudan, kullanışlı cevap vermek için çalışmakla ruhunda söyledikten sonra:

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 
} 

yalnızca 'sihirli' burada olduğunu:

  1. t ile arka planda bir komut çalıştırdığınızda o bash kabuğu (& sonuna eklediğinizde ne olur), $!'u kullanarak PID'yi keşfedebilirsiniz, ancak komutun hemen çalıştırılmasından hemen sonra. (Açıklamasına için Advanced Bash-Scripting Guide: Chapter 9. Another Look at Variables - 9.1. Internal Variables bakınız.)
  2. TASKB şart arama process.exit (0) failure başarı ya da process.exit (-1) && testi doğru işlenir, böylece. (Daha fazla bilgi için this answer bakınız.) npm-run-all paket aradığınızı olabilir
+0

Bu Bash hilesi için teşekkürler! bu mükemmel. Cevabınız aradığım şey. – franleplant

+2

runB'nin runA'dan $ TASK_PID'ye erişimi olduğunu sanmıyorum. – nathancahill

+0

Benim için çalışmıyor. – prongs

0

:

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

(-p onları çalıştırır: senin package.json dosyada Sonra

$ npm install --save npm-run-all 

Paralel olarak, ardışık olarak -s kullanın.)

İlgili konular