我使用npm脚本,我有一些应该并行运行。我有这样的事情:如何停止在后台自动运行npm脚本
...
scripts: {
"a": "taskA &",
"preb": "npm run a",
"b": "taskB"
}
...
这很好!但是我想在任务B完成后自动终止运行后台的taskA。
我该怎么做? 谢谢!
我使用npm脚本,我有一些应该并行运行。我有这样的事情:如何停止在后台自动运行npm脚本
...
scripts: {
"a": "taskA &",
"preb": "npm run a",
"b": "taskB"
}
...
这很好!但是我想在任务B完成后自动终止运行后台的taskA。
我该怎么做? 谢谢!
我不相信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
}
这里唯一的“魔术”是:
bash
外壳(当你添加&
到最后时会发生什么),你可以使用$!
来发现它的PID,但只能在命令运行后立即发现。 (参见Advanced Bash-Scripting Guide: Chapter 9. Another Look at Variables - 9.1. Internal Variables用于其描述。)&&
测试正确处理。 (有关详细信息,请参阅this answer。)的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
进行顺序。)
谢谢你的Bash技巧!太棒了。你的答案是我正在寻找的。 – franleplant
我不认为runB可以从runA访问$ TASK_PID。 – nathancahill
不适用于我。 – prongs