アプリ5個を1つのリポジトリで - 個人開発者のTurborepoモノレポ
複数のアプリとWebを1つのリポジトリで管理するTurborepoモノレポの構成法。共通設定の共有、キャッシュでビルドを節約、アプリごとのデプロイまで実践目線でまとめました。
要点まとめ
ひとりでアプリを複数作ると設定が散らばる。Turborepoモノレポでeslint・tsconfigをpackagesとして共有し、turboキャッシュで変わっていないアプリは再ビルドせず、--filterでアプリごとにデプロイする。
目次
ひとりでアプリを作っていると、リポジトリがどんどん増えていきます。アプリ1つ、Web 1つ、またアプリ1つ… そしてeslint設定を5回コピペすることになります。私はこれを1つのモノレポにまとめました。
散らばった設定こそ本当の問題
リポジトリが多いとき一番痛いのは、コードではなく設定です。
- eslint・prettier・tsconfigをリポジトリごとにコピー
- ルールを1つ変えたら全部を巡回して修正
- 共通UI・ユーティリティをnpmに上げるには些細すぎる
モノレポは、これを1か所で共有する方式に変えてくれます。
基本構成
apps/
├── web/ # 랜딩
├── blog/ # 이 블로그
├── wave/ # 오늘의 파도
└── ...
packages/
├── eslint-config/ # 공용 eslint
└── typescript-config/ # 공용 tsconfig
apps/* は実際のデプロイ対象、packages/* はアプリたちが共有する設定・コードです。各アプリの tsconfig.json はこう継承するだけです。
{ "extends": "@repo/typescript-config/nextjs.json" }
これでルールは packages の1か所だけで直せます。
turboキャッシュが核心
Turborepoの本当の武器はキャッシュです。各タスクの入力(ソース・設定)が変わっていなければ、以前の結果をそのまま再利用します。
turbo run build # 전체 빌드(바뀐 것만 실제로 돎)
turbo run build --filter=blog # blog 앱만
turbo.json にタスク間の依存と出力だけ宣言すればOKです。
{
"tasks": {
"build": { "dependsOn": ["^build"], "outputs": [".next/**"] }
}
}
2回目のビルドからは「FULL TURBO」で数秒で終わります。
アプリごとにデプロイする
1つのリポジトリでも、デプロイはアプリごとに分離されます。Dockerなら turbo prune で該当アプリのサブツリーだけ切り出して、イメージを軽くできます。
turbo prune blog --docker # blog + 내부 의존성만 남긴 out/ 생성
このブログもこうやって切り出して、ミニPCにDockerで載せました。その話はセルフホスティングの記事で扱っています。
まとめ
apps/*= デプロイ対象、packages/*= 共有設定- tsconfig・eslintは継承で1か所管理
turboキャッシュで変わっていないアプリは再ビルドしない--filter・pruneでアプリごとにデプロイ
ひとりで複数のプロダクトを運用するなら、モノレポは贅沢ではなく生存ツールです。
よくある質問
アプリが何個からモノレポが得になりますか?
2個を超えた時点で、共通設定(eslint・tsconfig・UI)が生まれるなら得です。設定を1か所で直してすべてのアプリに反映されるのが核心です。
ビルドが遅くなりませんか?
むしろ速くなります。turboは入力が変わっていないタスクの結果をキャッシュして、変わったアプリだけ再ビルドします。
関連記事
- 💻 開発
Next.jsでMDXブログをゼロから作る - このブログの作り方
CMSなしでマークダウンファイルだけで動くブログをNext.js 16 App Routerで作った過程。フォルダ構成、MDX設定、SEOまで実際のコードの流れでまとめました。
- 💻 開発
ミニPCにDocker + Cloudflare Tunnelでセルフホスティング
自宅のミニPC 1台で複数のWebサービスを安全に公開する方法。ポート開放なしでCloudflare TunnelでHTTPSをつなぎ、Docker Composeで運用します。
- ☕ 日常
個人開発者の1日のルーティン - ひとりで疲れ果てないために
上司も同僚もいない、ひとりの仕事は自由ですが、すぐに疲れてしまいます。リズムを失わないために守っている1日のルーティンと、いくつかのルールをまとめました。