如何自动停止在后台运行的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 } 

这里唯一的“ 魔术 ”是:

  1. 当你使用bash shell在后台运行一个命令时(这是在你添加&结束时发生的情况),你可以使用$!来发现它的PID $! ,但只能在命令运行后立即执行。 (参见高级Bash脚本指南:第9章。variables的另一个视angular – 9.1。内部variables的描述。)
  2. 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进行顺序运行。)