2024-9-15

Node.jsでdev serverを複数同時に動かすためのCLIツールを書いた

TypeScript

Node.jsでdev serverを複数同時に動かすためのmatomeというCLIツールを書いた。 skaffoldを使っていて、複数のログが色付けされて1つの標準出力に吐かれるのが便利だなと思ったのがきっかけ。

example

ハイフン区切りで実行したいコマンドを指定すれば、並行にプロセスが動かした上でそれぞれの標準出力をまとめてくれる。 プロセス毎に色が割り振られるので視認性も良い。

bash
Copied!
npx matome -- wrangler dev -- next start

やっていることは子プロセスを立ち上げて標準出力をパイプで受け取って出力しているだけだが、そこそこ便利なツールを作れたように思う。

主にMonorepoで複数の開発サーバーを同時に動かす必要がある状況を想定して作られている。 バックエンドのコードであればコンテナにつめてskaffoldやらdocker-composeでまとめて立ち上げることが比較的に簡単にできるが、 フロントエンドかつエッジで動かす必要がある状況だとメジャーなオーケストレーションツールがなかったりする。 コマンド1つでwragler devnext startなどが立ち上がって、かつnpmでさっと入るツールがあると嬉しいのでは?という思いつきで足がけ2日で作った。

ちなみにこんなツールを使わなくても、パッケージマネージャーが標準で似たような機能を搭載していたりする。 pnpmであれば"-r"オプションを指定してrunすれば、ワークスペース内のすべてのプロジェクトで同じスクリプトを動かせたりする。 yarnにもworkspaces foreachというコマンドがあって、まとめてスクリプトを動かせる。 これらのコマンドで用が足りない場合にはぜひmatomeを使ってみて欲しい。ただ似たようなツールは探せば他にもたくさんありそう。

実装に関するメモ

初めてNodeで開発用ツールを作ったが、開発環境周りのベストプラクティスがよくわからなかった。 開発用ツールなのでとりあえずNodeでさえ動けば良い、という考えからTypescriptで書いてtscでトランスパイルするだけの構成にした。 開発用ツールで特にバンドラーを挟むメリットは無い認識だが正しいか自信がない。1ファイルにまとまってコンパクト、以上の意味があるのだろうか

今回初めてnpmに作成したパッケージを初めてホストした。 手動では簡単にできるようにスクリプトを整備したが、まだリリースの自動化ができていない。 理想的にはPRがマージされる際にpackage.jsonのversionフィールドが増えていることを検知して、mainにマージされたら各種デプロイが走るようにしたい。 release-itという良さそうなツールがあるが、bumpしないでリリースだけするオプションが見当たらない...