あるアプリケーションをMonorepoで管理したくなり、Turborepoを使ったのでまとめます。
Turborepoとは
昨年末にVercelに買収されたことで話題となった、monorepoを管理するためのツールです。
この分野ではLernaが人気ですが、Turborepoも昨年末以降ダウンロード数を伸ばしているようです。
Monorepoツールの比較
それぞれのMonorepo管理ツールで何ができるかといった機能の比較などはこちらにまとまっていました。
LernaのメンテをNrwlが引き継ぐなどのニュースもあったので、今どれがベストかを判断するというよりも、好きに試してみるというモチベーションでTurborepoを選択しています。
手順
Workspaceの設定をする
Turborepoはyarn workspaceなどと互換性があります。
そのため、まず単一のリポジトリからWorkspaceを設定します。
./apps
ディレクトリを作成し、package.json
を書き換えます。
{
...
"private": true,
"scripts": {},
+ "workspaces": [
+ "apps/*"
+ ],
...
}
これでapps以下にディレクトリを切って、アプリケーションを配置します。
.
├── apps
│ └── repo1
│ └── repo2
├── README.md
├── package.json
└── yarn.lock
turboの設定
turbo のインストールをします。
yarn add turbo -DW
Turborepoはturbo.json
で設定を管理します。
{
"$schema": "https://turborepo.org/schema.json",
"baseBranch": "origin/main",
"pipeline": {
"build": {
"dependsOn": ["^build"]
},
"dev": {
"cache": false
}
}
}
このように設定すると、以下のコマンドで、全アプリケーションのbuildを実行することができます。
yarn turbo build
buildに設定されている、"dependsOn": ["^build"]
の ^
は、dependencies、devDependenciesのbuildタスクの完了を待つ記号です。
補足
Turborepoは各アプリケーションのタスクの依存関係を解決しながら処理を実行してくれます。
それらを管理するのがpipelineの設定です。
pipelineによって、依存しているタスクを並列実行することで、処理の最適化もしてくれます。
キャッシュ
Turborepoはコンテンツのハッシュから、タスク実施が必要なものを判断します。
例えば、複数のアプリケーションでbuildを行う時に、変更があったアプリケーションを自動で判定し、必要なbuildだけを行ってくれます。
これにより処理時間の短縮をすることができ便利です。
また、今回は設定していないですが、Vercel上にキャッシュを保存することで、CI/CDなど他の環境で実行した結果を用いて、タスクの処理時間の短縮をすることもできるようです。
最後に
Lernaにあるようなパッケージの公開、バージョン管理などはまだ無いようですが、アプリケーションの開発においては便利に感じました。
引き続き使って行きたいと思います。