こんにちは。トグルホールディングス SRE/プラットフォームエンジニアリングチームの小澤 (@kota65535)です。
この記事は トグルホールディングス アドベントカレンダー 2024 の 17 日目の記事です。
概要
近年、複数のサービスやパッケージを1つのレポジトリで管理する「モノレポ」構成を取る事例が増えています。背景には以下のような事情があります。
- マイクロサービス化が進んだことでリリースが煩雑になった
- モノレポであれば複数のサービスの同期的なリリース・デプロイは容易
- 技術スタックがフロントエンド・バックエンドで統一しやすくなった
- ただし統一する場合はJS/TS一択
- モノレポ管理ツールが成熟して簡単に導入できるようになった
特にモノレポ管理ツールは群雄割拠とも言えるような状況で、State of JS 2023 の Monorepo Tools の部では18個のツールの名前が挙げられています。 そこでこの記事ではそれらを徹底比較…したかったのですが全然調査時間が足りなかったので、今回は以下の2軸に焦点を絞りたいと思います。
- 対応言語: 対応するプログラミング言語の数
- 複雑度: 設定の複雑さ。機能の豊富さとある程度比例する
比較 & 所感
いきなりですが比較結果が以下の図となります。

各ツールの所感です。
- Bazel
- Pants
- Moonrepo
- 主にJS/TSのモノレポ向けだがRustなどの言語にも対応
- protoというasdfみたいなバージョン管理ツールと統合できる
- Gradle
- Rush
- 大規模なJS/TSモノレポ向け
- 機能が豊富だが設定は複雑
- NX
- Turborepo
- JS/TSモノレポ用
- 設定はシンプル
- TUIが便利で非常にログが見やすい
- Wireit
- JS/TSモノレポ用
- 既存の package.json に設定を追加するだけ
- devサーバーなど起動しっ放しのタスク(サービス)への依存関係を定義できる
- Lage
- JS/TSモノレポ用
- 設定がシンプル
- Make
- Just
- Makeの扱いづらいところを改善したツール
- キャッシュによる高速化とかは無い
- あとインクリメンタルビルドも無い
- Task
- Go製のタスクランナー
- Makeを使うくらいならこっちが良いと思う
結論
対応言語と複雑度という2軸でかなり雑にモノレポツールを比較しました。また時間が取れたら詳しく調査します。