如何自动停止在后台运行的npm脚本
我使用npm脚本,我有一些应该并行运行。 我有这样的东西:
... scripts: { "a": "taskA &", "preb": "npm run a", "b": "taskB" } ...
这可以! 但是我想在任务B完成后自动终止运行taskA。
我怎样才能做到这一点? 谢谢!
我不相信npm是pipe理stream程之间复杂关系的最佳工具。
通过创build一个使用节点的child_process
模块来pipe理协同进程的启动和终止的节点脚本(可能使用spawn
,可以更好地为您服务。
话虽如此,并始终努力提供一个直接的,有用的答案的精神。
你可以像( 假设 bash shell)一样构造你的npm脚本:
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在后台运行一个命令时(这是在你添加&
结束时发生的情况),你可以使用$!
来发现它的PID$!
,但只能在命令运行后立即执行。 (参见高级Bash脚本指南:第9章。variables的另一个视angular – 9.1。内部variables的描述。) - taskB 必须在成功时调用process.exit(0),或者在失败时调用process.exit(-1),以便正确处理
&&
testing。 (有关更多信息,请参阅此答案 。)
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
进行顺序运行。)