2015-01-06 4 views
6

Im usando gli script npm, alcuni di essi dovrebbero essere eseguiti in parallelo. Ho qualcosa di simile:Come arrestare automaticamente lo script npm in background

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

Questo va bene! Ma mi piacerebbe uccidere automaticamente taskA che esegue lo sfondo dopo che l'attivitàB ha terminato.

Come posso farlo? Grazie!

risposta

14

Non credo che npm sia lo strumento migliore per gestire relazioni complesse tra processi.

Sarebbe molto meglio servire creando uno script nodo che utilizza il modulo child_process del nodo per gestire l'avvio e l'abbattimento dei co-processi, utilizzando forse spawn.

Detto questo, e nello spirito di sempre cercando di fornire una risposta diretta utilizzabile ..

Si potrebbe strutturare i propri script NPM come (assume shell bash):

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 
} 

l'unica 'magia' è che:

  1. quando si esegue un comando in background utilizzando t La shell bash (che è ciò che accade quando si aggiunge & alla fine), è possibile scoprirlo PID utilizzando $!, ma solo immediatamente dopo l'esecuzione del comando. (Vedere Advanced Bash-Scripting Guide: Chapter 9. Another Look at Variables - 9.1. Internal Variables per la sua descrizione.)
  2. TaskB must chiamata process.exit (0) in caso di successo o process.exit (-1) su guasto in modo che il test && si gestisce correttamente. (Vedere this answer per ulteriori informazioni.)
+0

Grazie per il trucco di Bash! è fantastico. La tua risposta è quella che stavo cercando. – franleplant

+2

Non penso che runB abbia accesso a $ TASK_PID da runA. – nathancahill

+0

Non funziona per me. – prongs

0

Il pacchetto npm-run-all può essere quello che stai cercando:

$ npm install --save npm-run-all 

Poi, nel tuo package.json del file:

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

(-p li corre in parallelo, usa -s per sequenziale.)