我使用npm脚本,我有一些应该并行运行。我有这样的事情:
...
scripts: {
"a": "taskA &",
"preb": "npm run a",
"b": "taskB"
}
...
这很好!但是我想在taskB完成后自动杀死taskA运行后台。
我该怎么做? 谢谢!
答案 0 :(得分:16)
我不相信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
shell在后台运行命令时(这是在结尾添加&
时会发生的情况),您可以使用$!
发现它,但是仅在命令运行后立即执行。 (有关其说明,请参阅Advanced Bash-Scripting Guide: Chapter 9. Another Look at Variables - 9.1. Internal Variables。)&&
测试。 (有关详细信息,请参阅this answer。)答案 1 :(得分:1)
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
进行顺序。)
答案 2 :(得分:0)
使用concurrently package看起来不那么棘手&痛苦的方式。这样可以完全避免分离的进程(&
)。并承诺更加跨平台。
npm install concurrently --save
然后在 package.json
中"runBoth": "concurrently \"npm run taskA\" \"npm run taskB\"",
经过测试(在Ubuntu 16.04,npm 5.6下),也是see here。