npmのコマンドを同時実行することができるconcurrentlyというmoduleを使った時に、サブコマンドにコマンドライン引数を渡す場合にちょっとハマったのでメモ。

やりたいこと

Firebaseのローカルエミュレーターを立ち上げて、jestでパスマッチするファイルのみテストをしたい

ダメだった例

以下のようにconcurrentlyで並列タスクを実行するようにしただけではダメでした。

"scripts": {
  "test": "concurrently --kill-others --success first \"yarn firebase emulators:start\" \"yarn jest\""
}
# `users`にマッチするファイルのテストを実行
# これではうまくいかない
$ yarn test users

yarn jestに引数が渡らず、concurrently自体の引数として認識されてしまうためうまくいかない模様。

解決策

bash -cでbashのコマンドとして実行し、引数を渡してあげると✌️

"scripts": {
    "test": "bash -c 'concurrently --kill-others --success first \"yarn firebase emulators:start\" \"yarn jest ${0}\"'"
}
# `users`にマッチするファイルのテストを実行
# ${0} に`users`が入り、無事にusers**.testだけ実行できる
$ yarn test users