2015-01-06 135 views
6

我使用npm脚本,我有一些应该并行运行。我有这样的事情:如何停止在后台自动运行npm脚本

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

这很好!但是我想在任务B完成后自动终止运行后台的taskA。

我该怎么做? 谢谢!

回答

14

我不相信npm是管理流程之间复杂关系的最佳工具。

通过创建一个节点脚本,使用节点的child_process模块来管理协同进程的启动和终止,或许使用spawn,您将会更好地服务。

说了这么多,而在总是试图提供一个直接的,可回答的精神..

你可以组织你的NPM脚本像(假设的bash shell):

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. 当你采用t在后台运行一个命令他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。)
+0

谢谢你的Bash技巧!太棒了。你的答案是我正在寻找的。 – franleplant

+2

我不认为runB可以从runA访问$ TASK_PID。 – nathancahill

+0

不适用于我。 – prongs

0

npm-run-all包可能是你在找什么:

$ npm install --save npm-run-all 

然后在您的package.json文件:

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

-p运行它们并行地,使用-s进行顺序。)