npm run-script のお供に parallelshell

最近関わっているプロジェクトでは タスク・ランナーをnpm run-scriptでラップ - Weblog - Hail2u.net に書かれているように、npm run-script でタスクを呼び出し、実際のビルドは gulp でおこなう、という形にしている。

そうなると、プロセスを同時に動かすために、package.json のscriptsプロパティに

  "serve": "gulp build; node tools/server.js & gulp watch",

と書いたりするわけだが、これだと問題がある。

gulp watch のプロセスが何かの拍子に突然死したときに 開発用サーバーのnodeのプロセスが残り続けてしまうので、次に npm run serve で 開発用サーバーを立ち上げようとすると EADDRUSE エラーでコケてしまう。
psやlsofでプロセスを特定して殺せばよいのだが、それを開発者やデザイナー全員に都度おこなわせるのはおかしい。

どうしたものかな、と色々調べたら、 Grunt/Gulpで憔悴したおっさんの話 - MOL で紹介されている parallelshell というモジュールが良さそうだった。

具体的には、以下のように使う。

  "serve": "gulp build; parallelshell 'node tools/server.js' 'gulp watch'"

READMEに

& creates a background process, which only exits if you kill it or it ends. parallelshell will autokill processes if one of the others dies.

とあるように、いずれかのプロセスが死んだら、他のプロセスも始末してくれる。
parallelshell、モジュールのコードは100~200行程度で機能がシンプルなのが好印象だ。

先の記事や ビルドツールとしてnpmを使う | 69log のようにビルドツールとして、ヘヴィに npm run-script を使う場合はプロセスを同時に動かすこともよくあるので、そんなときのお供に parallelshell はどうじゃろか、と思った次第です。