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 はどうじゃろか、と思った次第です。