2023年に向けて Monorepo 管理ツールの概要と現状を調べておきたい ( フロントエンド寄り )
このスラクップについて
個人的に、今年は monorepo 界隈に色々な出来事が起こった年のように思いました。
このスクラップでは 2022 年時点での Monorepo 界隈の事情を調査して、まとめるスクラップになります。
個人的な目的
フロントエンド環境で monorepo 使いたいので、その環境構築するための参考材料にしたい。
Monorepo についての解説は以下のサイトが参考になると思います👇
Monorepo ツールが提供する必要があるもの
Monorepo Explainedでは以下の機能が必要だと説明している。
- Local computation caching
- 実行結果などを保存しておいて、無駄なタスクを実行しないようにする機能
- Local task orchestration
- タスクを正しい順序で並行して実行する機能
- Distributed computation caching
- 異なる環境間で(ビルド結果などの)キャッシュを共有する機能
- CI 環境で同じものをビルドするのを防ぐ
- Distributed task execution
- 1 台のマシンでコマンドを実行する際に分散して実行させる機能
- Transparent remote execution
- ローカルで開発しながら、複数のマシンで任意のコマンドを実行する機能[1]
- Detecting affected projects/packages
- プロジェクト・パッケージ内の変更を検出する機能
- 影響を受けるパッケージを見つけてビルド・テストなどを実行するのに必要
- Workspace analysis
- 追加の構成なしでワークスペースのProject Graphを理解する機能
- これが無いと設定ファイルにフォルダー構造などを設定する必要がある(と思う)
- Dependency graph visualization
- プロジェクトやタスク間の依存関係を視覚化する機能
- Nx の動画があるので参考に → Nx Dependency Graph
- Source code sharing
- ソースコードの個々の部分の共有を容易にする機能
- ワークスペース内の車輪の大発明を防ぐために必要
- Consistent tooling
- 多言語サポート機能
- 別言語でも同じように使える機能
- Code generation
- コードを生成する機能
- Project constraints and visibility
- リポジトリ内の依存関係を制限する機能
- 間違ってフロントエンドがバックエンドのパッケージをインストールしないようにするなどが出来る(らしい)
個人的に上記の機能全ては必要なくて、プロダクトの性質に合った機能があればいいと思う。
全部あっても使いきれないと思うし...
各ライブラリの使用状況などについて
少し古いのとフロントエンドに限定されるが The Stateof JS 2021 を参考に書き出してみる。
ランキングについての注意点
認知度が10%以下の技術は含めていません。度合いは次のように定義しています。
- 満足度:また使いたい vs もう使わない
- 興味:学びたい vs 興味がない
- 利用率:また使いたい + もう使わない vs 認知度
- 認知度:総数 - 聞いたことがない
上記は https://2021.stateofjs.com/en-US/libraries/monorepo-tools/ より引用
満足度
1位. pnpm ( 89% )
2位. Turborepo ( 88% )
3位. Nx ( 85% )
4位. npm Workspaces ( 84% )
5位. Yarn Workspaces ( 80% )
6位. Yalc ( 76% )
7位. Lerna ( 60% )
8位. Rush ( 59% )
興味
1位. Turborepo ( 80% )
2位. Nx ( 69% )
3位. pnpm / npm Workspaces ( 67% )
4位. Yarn Workspaces / Rush ( 60% )
5位. Lerna ( 56% )
6位. Yalc ( 39% )
利用率
1位. Lerna / Yarn Workspaces ( 25% )
2位. npm Workspaces ( 18% )
3位. pnpm / Nx ( 13% )
4位. Turborepo ( 3% )
5位. Yalc / Rush ( 2% )
認知度
1位. Yarn Workspaces ( 55% )
2位. npm Workspaces / Lerna ( 53% )
3位. pnpm ( 50% )
4位. Nx ( 34% )
5位. Turborepo ( 30% )
6位. Rush ( 11% )
7位. Yalc ( 6% )
Bazel
Google が社内開発に使用していた独自ビルドツールをオープンソース化したプロダクト。
最近読んだ記事にも出てきたので個人的にタイムリー。
特徴
多言語のサポート: Bazel は多くの言語に対応しています。任意のプログラミング言語をサポートするように拡張することもできます。
高レベルのビルド言語: プロジェクトは BUILD 言語で記述されます。これは、プロジェクトを相互接続された小さなライブラリ、バイナリ、テストのセットとして記述する、簡潔なテキスト形式です。これに対して、Make などのツールでは個々のファイルとコンパイラの呼び出しを記述する必要があります。
マルチプラットフォームのサポート: 同じツールと同じ BUILD ファイルを使用して、異なるアーキテクチャ、さらには異なるプラットフォーム向けのソフトウェアを構築できます。Google では、Bazel を使用して、データセンターのシステムで実行されているサーバー アプリケーションや、スマートフォンで動作するクライアント アプリまで、あらゆるものを構築しています。
再現性: BUILD ファイルでは、ライブラリ、テスト、バイナリごとに、直接依存関係を完全に指定する必要があります。Bazel は、この依存関係情報を使用して、ソースファイルに変更を加えるときに再構築する必要があるものや、並行して実行できるタスクを特定します。つまり、すべてのビルドが増分的であり、常に同じ結果が得られます。
スケーラブル: Bazel は大規模なビルドを処理できます。Google では、サーバー バイナリに 10 万個のソースファイルが含まれるのが一般的であり、ファイルが変更されないビルドには約 200 ミリ秒かかります。
機能サポートについて
- タスクのキャッシュ ( Local computation caching )
- タスクの順序を考慮した並列処理 ( Local task orchestration )
- キャッシュ共有 ( Distributed computation caching )
-
コマンドの分散処理 ( Distributed task execution )
- Monorepo Explained によると得意らしい
- これの事かな → https://bazel.build/basics/distributed-builds
- リモートでコマンド実行 ( Transparent remote execution )
-
影響範囲の検出 ( Detecting affected projects/packages )
- bazel-diff, determinator を使うとイケるみたい
-
ワークスペース解析 ( Workspace analysis )
-
BUILD.bazel
を使用する必要がある
-
-
依存関係の可視化 ( Dependency graph visualization )
- 古い記事があるけどコレ?
- コード共有 ( Source code sharing )
- 多言語サポート ( Consistent tooling )
- コード生成 ( Code generation )
- 依存関係を制限する ( Project constraints and visibility )
感想
- 昔からあるツールかつGoogleが関わっているので、ドキュメントもあるし記事とかも多い印象
- けっこう大規模向けなのかな~って感じがした
- コンパイルする必要のある言語とかだといいかも
- 少なくともフロントエンドでは使わなくてもいいかな~って感じがした
Gradle
主にJava向けのビルドツールだが、他の言語( Java, Scala, Android, Kotlin, C/C++, Groovy )でも使えるみたい。
Maven との比較している辺り、Maven ユーザーをターゲットにしている感じがする。
特徴
- めっちゃくちゃ多いので、公式サイトを参照してください
- 少なくとも十分な機能は備わっているので、ある程度の規模であれば問題なさそう
- Gradle Enterprise 使うとより便利になるらしい
機能サポートについて
- タスクのキャッシュ ( Local computation caching )
- タスクの順序を考慮した並列処理 ( Local task orchestration )
- キャッシュ共有 ( Distributed computation caching )
-
コマンドの分散処理 ( Distributed task execution )
- Gradle Enterprise 使う必要がある
- リモートでコマンド実行 ( Transparent remote execution )
- 影響範囲の検出 ( Detecting affected projects/packages )
- ワークスペース解析 ( Workspace analysis )
-
依存関係の可視化 ( Dependency graph visualization )
- サードパーティツールを使う必要がある
- コード共有 ( Source code sharing )
- 多言語サポート ( Consistent tooling )
- コード生成 ( Code generation )
- 依存関係を制限する ( Project constraints and visibility )
感想
- Java 使っているならいいかも
- ドキュメントもしっかりしている印象、記事もある程度ある
- フロントエンドでは使わないかな~って感じがした
- Javaと一緒に使う必要があれば使ってもいいかも?
Lage
Microsoft が作っているビルドツール。
パイプラインを提供することで、ビルド後のスクリプトを効率良く実行できる( らしい )。
機能サポートについて
- タスクのキャッシュ ( Local computation caching )
- タスクの順序を考慮した並列処理 ( Local task orchestration )
- キャッシュ共有 ( Distributed computation caching )
- コマンドの分散処理 ( Distributed task execution )
- リモートでコマンド実行 ( Transparent remote execution )
- 影響範囲の検出 ( Detecting affected projects/packages )
-
ワークスペース解析 ( Workspace analysis )
- package.json から解析する
-
依存関係の可視化 ( Dependency graph visualization )
- 自分でコード書けば出来なくはない
-
コード共有 ( Source code sharing )
- npm packages 内だけなら大丈夫
-
多言語サポート ( Consistent tooling )
- JavaScript ( TypeScript ) のみ
- 依存関係を制限する ( Project constraints and visibility )
感想
- フロントエンド向けのビルドツール
- Lerna とかよりは出来る事が少ない感じがする
- その代わりシンプルに扱える感じ
- めっちゃ速いなら使っても良さそうだが、機能が少なすぎる気もする
Nx
... 🖊
機能サポートについて
- タスクのキャッシュ ( Local computation caching )
- タスクの順序を考慮した並列処理 ( Local task orchestration )
- キャッシュ共有 ( Distributed computation caching )
- コマンドの分散処理 ( Distributed task execution )
- リモートでコマンド実行 ( Transparent remote execution )
- 影響範囲の検出 ( Detecting affected projects/packages )
- ワークスペース解析 ( Workspace analysis )
- 依存関係の可視化 ( Dependency graph visualization )
- コード共有 ( Source code sharing )
- 多言語サポート ( Consistent tooling )
- 依存関係を制限する ( Project constraints and visibility )
感想
... 🖊
Lerna
... 🖊
機能サポートについて
- タスクのキャッシュ ( Local computation caching )
- タスクの順序を考慮した並列処理 ( Local task orchestration )
- キャッシュ共有 ( Distributed computation caching )
- コマンドの分散処理 ( Distributed task execution )
- リモートでコマンド実行 ( Transparent remote execution )
- 影響範囲の検出 ( Detecting affected projects/packages )
- ワークスペース解析 ( Workspace analysis )
- 依存関係の可視化 ( Dependency graph visualization )
- コード共有 ( Source code sharing )
- 多言語サポート ( Consistent tooling )
- 依存関係を制限する ( Project constraints and visibility )
感想
... 🖊
Pants
... 🖊
機能サポートについて
- タスクのキャッシュ ( Local computation caching )
- タスクの順序を考慮した並列処理 ( Local task orchestration )
- キャッシュ共有 ( Distributed computation caching )
- コマンドの分散処理 ( Distributed task execution )
- リモートでコマンド実行 ( Transparent remote execution )
- 影響範囲の検出 ( Detecting affected projects/packages )
- ワークスペース解析 ( Workspace analysis )
- 依存関係の可視化 ( Dependency graph visualization )
- コード共有 ( Source code sharing )
- 多言語サポート ( Consistent tooling )
- 依存関係を制限する ( Project constraints and visibility )
感想
... 🖊
Rush
... 🖊
機能サポートについて
- タスクのキャッシュ ( Local computation caching )
- タスクの順序を考慮した並列処理 ( Local task orchestration )
- キャッシュ共有 ( Distributed computation caching )
- コマンドの分散処理 ( Distributed task execution )
- リモートでコマンド実行 ( Transparent remote execution )
- 影響範囲の検出 ( Detecting affected projects/packages )
- ワークスペース解析 ( Workspace analysis )
- 依存関係の可視化 ( Dependency graph visualization )
- コード共有 ( Source code sharing )
- 多言語サポート ( Consistent tooling )
- 依存関係を制限する ( Project constraints and visibility )
感想
... 🖊
Turborepo
... 🖊
機能サポートについて
- タスクのキャッシュ ( Local computation caching )
- タスクの順序を考慮した並列処理 ( Local task orchestration )
- キャッシュ共有 ( Distributed computation caching )
- コマンドの分散処理 ( Distributed task execution )
- リモートでコマンド実行 ( Transparent remote execution )
- 影響範囲の検出 ( Detecting affected projects/packages )
- ワークスペース解析 ( Workspace analysis )
- 依存関係の可視化 ( Dependency graph visualization )
- コード共有 ( Source code sharing )
- 多言語サポート ( Consistent tooling )
- 依存関係を制限する ( Project constraints and visibility )
感想
... 🖊
npm workspace
... 🖊
機能サポートについて
- タスクのキャッシュ ( Local computation caching )
- タスクの順序を考慮した並列処理 ( Local task orchestration )
- キャッシュ共有 ( Distributed computation caching )
- コマンドの分散処理 ( Distributed task execution )
- リモートでコマンド実行 ( Transparent remote execution )
- 影響範囲の検出 ( Detecting affected projects/packages )
- ワークスペース解析 ( Workspace analysis )
- 依存関係の可視化 ( Dependency graph visualization )
- コード共有 ( Source code sharing )
- 多言語サポート ( Consistent tooling )
- 依存関係を制限する ( Project constraints and visibility )
感想
... 🖊
yarn workspace
... 🖊
機能サポートについて
- タスクのキャッシュ ( Local computation caching )
- タスクの順序を考慮した並列処理 ( Local task orchestration )
- キャッシュ共有 ( Distributed computation caching )
- コマンドの分散処理 ( Distributed task execution )
- リモートでコマンド実行 ( Transparent remote execution )
- 影響範囲の検出 ( Detecting affected projects/packages )
- ワークスペース解析 ( Workspace analysis )
- 依存関係の可視化 ( Dependency graph visualization )
- コード共有 ( Source code sharing )
- 多言語サポート ( Consistent tooling )
- 依存関係を制限する ( Project constraints and visibility )
感想
... 🖊