【初心者向け】Turborepoでモノレポ管理を始める完全ガイド|メリットと実践手順

kento_morota 18分で読めます

モノレポ管理とは?Turborepoを選ぶ理由

複数のWebアプリケーションや社内システムを開発していると、「どのリポジトリに共通コードがあったか分からない」「同じ機能を何度も実装している」といった課題に直面します。

モノレポ(Monorepo)管理は、複数のプロジェクトを一つのリポジトリで一元管理する手法です。中小企業のIT担当者にとって、属人化の防止や開発効率の向上に有効なアプローチとして注目されています。

モノレポの基本概念とマルチレポとの違い

モノレポとは、複数のアプリケーションやライブラリを一つのバージョン管理システムで管理する手法です。従来のマルチレポ(プロジェクトごとに別リポジトリ)と比較して、以下のような構造になります。

my-monorepo/
├── apps/
│   ├── web-app/        # Webアプリケーション
│   ├── admin-panel/    # 管理画面
│   └── mobile-app/     # モバイルアプリ
├── packages/
│   ├── ui-components/  # 共通UIコンポーネント
│   ├── utils/          # 共通ユーティリティ
│   └── config/         # 共通設定
└── package.json

モノレポの主なメリット

  • コードの共有が容易で、共通コンポーネントを即座に全プロジェクトで利用可能
  • コーディング規約や設定を統一しやすく、一貫性を維持できる
  • 変更の影響範囲が把握しやすく、複数プロジェクトにまたがる変更を一度に完了できる
  • 一度のクローンで全プロジェクトの開発環境を構築可能

モノレポの注意点

  • リポジトリサイズが大きくなり、クローン時間が増加する可能性
  • アクセス権限をプロジェクトごとに分けにくい
  • 適切なツールを使わないとビルド時間が増加
  • モノレポ管理ツールの学習コストが発生

中小企業では、3つ以上の関連プロジェクトを管理している場合、モノレポ化による効率化のメリットが大きいと言えます。

モノレポ管理が向いているケース

以下のチェックリストで、自社のプロジェクトが向いているか確認してみましょう。

向いているケース

  • ✅ 複数のアプリケーションで共通のUIコンポーネントやライブラリを使用
  • ✅ フロントエンドとバックエンドを同じチームで開発
  • ✅ 顧客向けサイトと管理画面など、関連性の高い複数システムを運用
  • ✅ TypeScriptやReactなど、共通の技術スタックを使用
  • ✅ 少人数のチームで複数プロジェクトを管理

具体的なプロジェクト例

  1. ECサイトと管理画面:商品情報の型定義、APIクライアント、バリデーションロジックを共有
  2. Webアプリとモバイルアプリ:ビジネスロジック、共通コンポーネントを共有
  3. 複数の社内システム:認証機能、ユーザー管理、共通UIライブラリを統一管理

Turborepoの特徴と選ぶべき理由

モノレポ管理ツールには、Turborepo、Nx、Lernaなどがありますが、Turborepoは初心者に優しく、学習コストが低いことで注目されています。Vercel社が開発・保守しており、特に高速なビルドとキャッシュ機能に優れています。

Turborepoの3つのコア機能

1. タスクのパイプライン管理

複数のプロジェクト間のビルド、テスト、リントなどのタスクを効率的に実行します。依存関係を理解し、並列実行可能なタスクは自動的に並列化します。

{
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**"]
    },
    "test": {
      "dependsOn": ["build"]
    }
  }
}

2. インテリジェントなキャッシュ機能

一度実行したタスクの結果をキャッシュし、コードに変更がない場合は再実行をスキップします。これにより、ビルド時間を最大90%削減できる場合もあります。

# 初回実行
$ turbo run build
Tasks:    3 successful, 3 total
Time:     12.5s

# 2回目(変更なし)
$ turbo run build
Tasks:    3 successful, 3 total
Cached:   3 cached, 3 total
Time:     0.8s

3. リモートキャッシュの共有

チームメンバー間やCI/CD環境でキャッシュを共有できます。誰かが一度ビルドすれば、他のメンバーはそのキャッシュを利用できるため、チーム全体の生産性が向上します。

他のツールとの比較

ツール 学習コスト ビルド速度 設定の複雑さ 適したケース
Turborepo 低い 非常に速い シンプル 初めてのモノレポ、小〜中規模
Nx 高い 速い 複雑 大規模、エンタープライズ
Lerna 中程度 普通 中程度 npmパッケージの公開管理

Turborepoの優位性

  • turbo.json一つで主要な設定が完結
  • 既存プロジェクトへの段階的な導入が容易
  • Vercelとの統合でデプロイ時のキャッシュ活用が簡単
  • フレームワーク非依存で、Next.js、Vite、Remixなど、どのフレームワークでも使用可能

初心者におすすめな理由

最小限の設定で始められる

# プロジェクト作成
npx create-turbo@latest

わずか数行の設定で動作するモノレポが完成します。複雑な概念を理解しなくても、基本的な機能をすぐに使い始められます。

既存のツールチェーンをそのまま使える

TypeScript、ESLint、Prettierなど、既に使い慣れたツールをそのまま利用できます。新しいツールを覚える必要がありません。

段階的な導入が可能

既存のマルチレポ環境から、少しずつモノレポに移行できます。すべてを一度に変更する必要がないため、リスクを最小限に抑えられます。

Turborepoでモノレポ管理するメリット

コード共有と再利用性の向上

共通UIコンポーネントの一元管理

従来は各プロジェクトでコンポーネントをコピー&ペーストし、デザイン変更時に複数箇所を修正する必要がありました。Turborepoでは、共通コンポーネントをpackages/uiとして管理し、両方のアプリから参照できます。

// packages/ui/src/Button.tsx
export const Button = ({ children, onClick }) => {
  return <button onClick={onClick}>{children}</button>
}

// apps/web/src/pages/index.tsx
import { Button } from '@mycompany/ui'

// apps/admin/src/pages/dashboard.tsx
import { Button } from '@mycompany/ui'

デザイン変更はpackages/uiだけで行えば、すべてのアプリに自動的に反映されます。

型定義の統一

TypeScriptの型定義を共有することで、フロントエンドとバックエンドの型の不一致を防げます。

// packages/types/src/user.ts
export interface User {
  id: string
  name: string
  email: string
}

実際の導入事例では、共通コンポーネントの再利用率が60%向上し、新機能開発のスピードが40%短縮されました。

一貫した開発環境の維持

統一された設定管理

TypeScript、ESLint、Prettierの設定を一箇所で管理できます。

// packages/tsconfig/base.json(共通設定)
{
  "compilerOptions": {
    "strict": true,
    "esModuleInterop": true
  }
}

// apps/web/tsconfig.json(継承して使用)
{
  "extends": "@mycompany/tsconfig/base.json"
}

メリット

  • 新メンバーのオンボーディングが簡単(一度の環境構築で全プロジェクトに参加可能)
  • コードレビューの基準が統一され、チーム全体で同じ品質基準を維持
  • 設定やツールが統一されることで、属人化を防止

注意すべきデメリットと対策

リポジトリサイズの増加

すべてのプロジェクトを一つのリポジトリに含めるため、リポジトリのサイズが大きくなります。

対策
- Git LFSを使用して大きなバイナリファイルを管理
- Shallow Cloneでクローン時間を短縮:git clone --depth 1
- 不要なファイルを.gitignoreに適切に追加

初期学習コスト

チームメンバーがモノレポの概念やTurborepoの使い方を学ぶ必要があります。

対策
- まず小規模なプロジェクトで試す段階的な導入
- 社内向けのセットアップガイドを作成
- 経験者と未経験者でペアプログラミング
- 定期的な勉強会でチーム内で知識を共有

アクセス権限の管理

一つのリポジトリに全コードがあるため、プロジェクトごとの権限分離が難しくなります。

対策
- ブランチ保護ルールで重要なディレクトリへの変更にはレビューを必須化
- CODEOWNERSファイルでディレクトリごとに責任者を明確化
- セキュリティ要件が厳しい場合は無理にモノレポ化しない

Turborepoの環境構築と初期設定

必要な環境とツールの準備

Turborepoを始めるには、以下の環境が必要です。

  • Node.js:v18.0.0以上(推奨:v20以上)
  • パッケージマネージャー:npm、yarn、pnpmのいずれか
  • Git:バージョン管理用

Turborepoプロジェクトの作成手順

1. プロジェクトの作成

npx create-turbo@latest

対話形式で以下の質問に答えます。

  • プロジェクト名
  • パッケージマネージャーの選択(npm/yarn/pnpm)
  • テンプレートの選択(基本/Next.js/Remixなど)

2. プロジェクト構造の確認

my-turbo-app/
├── apps/
│   ├── web/           # Next.jsアプリ
│   └── docs/          # ドキュメントサイト
├── packages/
│   ├── ui/            # 共通UIコンポーネント
│   ├── eslint-config/ # ESLint設定
│   └── typescript-config/ # TypeScript設定
├── turbo.json         # Turborepo設定
└── package.json

3. 依存関係のインストール

cd my-turbo-app
npm install

4. 開発サーバーの起動

npm run dev

すべてのアプリケーションが同時に起動します。

turbo.jsonの基本設定

turbo.jsonは、Turborepoの動作を制御する設定ファイルです。

{
  "$schema": "https://turbo.build/schema.json",
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", ".next/**"]
    },
    "dev": {
      "cache": false,
      "persistent": true
    },
    "lint": {
      "dependsOn": ["^lint"]
    },
    "test": {
      "dependsOn": ["build"],
      "outputs": ["coverage/**"]
    }
  }
}

主要な設定項目

  • dependsOn:タスクの依存関係を定義(^buildは依存パッケージのビルドを先に実行)
  • outputs:キャッシュ対象のファイルを指定
  • cache:キャッシュの有効/無効
  • persistent:開発サーバーなど、継続的に実行するタスクに指定

パッケージマネージャーの選び方

パッケージマネージャー 特徴 推奨ケース
npm Node.js標準、安定性が高い 初心者、安定性重視
yarn 高速、ワークスペース機能が充実 チーム開発
pnpm 最も高速、ディスク容量を節約 大規模モノレポ

推奨:pnpm

モノレポ管理では、pnpmが最も効率的です。

npm install -g pnpm
pnpm create turbo@latest

Turborepoでの実践的なモノレポ管理

ワークスペースの構成とディレクトリ設計

基本的なディレクトリ構成

my-monorepo/
├── apps/              # アプリケーション
│   ├── web/          # 顧客向けWebサイト
│   ├── admin/        # 管理画面
│   └── api/          # バックエンドAPI
├── packages/          # 共通パッケージ
│   ├── ui/           # UIコンポーネント
│   ├── utils/        # ユーティリティ関数
│   ├── types/        # TypeScript型定義
│   └── config/       # 共通設定
└── turbo.json

package.jsonでのワークスペース定義

{
  "name": "my-monorepo",
  "private": true,
  "workspaces": [
    "apps/*",
    "packages/*"
  ]
}

共通ライブラリの管理方法

共通UIコンポーネントパッケージの作成

cd packages
mkdir ui
cd ui
npm init -y
// packages/ui/package.json
{
  "name": "@mycompany/ui",
  "version": "0.0.0",
  "main": "./src/index.tsx",
  "types": "./src/index.tsx",
  "dependencies": {
    "react": "^18.2.0"
  }
}

アプリケーションからの利用

// apps/web/package.json
{
  "dependencies": {
    "@mycompany/ui": "*"
  }
}
// apps/web/src/pages/index.tsx
import { Button } from '@mycompany/ui'

タスクのパイプライン設定とキャッシュ活用

効率的なパイプライン設定

{
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", ".next/**", "build/**"]
    },
    "test": {
      "dependsOn": ["build"],
      "outputs": ["coverage/**"],
      "inputs": ["src/**/*.tsx", "src/**/*.ts", "test/**"]
    },
    "lint": {
      "outputs": []
    }
  }
}

特定のアプリのみ実行

# webアプリのみビルド
turbo run build --filter=web

# webアプリとその依存関係をビルド
turbo run build --filter=web...

運用フェーズで押さえておきたいポイント

チーム開発でのルール作り

CODEOWNERSファイルの設定

# .github/CODEOWNERS
/apps/web/              @frontend-team
/apps/api/              @backend-team
/packages/ui/           @design-system-team

コミットメッセージの規約

feat(web): ログイン機能を追加
fix(ui): ボタンのスタイル修正
docs(readme): セットアップ手順を更新

リモートキャッシュの活用方法

Vercelアカウントでのリモートキャッシュ設定

# Vercelにログイン
npx turbo login

# リモートキャッシュをリンク
npx turbo link
// turbo.json
{
  "remoteCache": {
    "signature": true
  }
}

これにより、チームメンバー全員がキャッシュを共有し、ビルド時間を大幅に短縮できます。

よくあるエラーと対処法

エラー1:キャッシュが効かない

原因:環境変数が変更されている

対処法:

{
  "pipeline": {
    "build": {
      "env": ["NODE_ENV", "API_URL"]
    }
  }
}

エラー2:依存関係の解決に失敗

原因:パッケージ名の不一致

対処法:package.jsonのnameフィールドを確認し、一貫性を保つ

モノレポ管理の改善サイクル

月次メンテナンス

  • 依存パッケージの更新
  • 不要なコードの削除
  • ドキュメントの更新
  • ビルド時間のモニタリング

パフォーマンス測定

# ビルド時間の測定
turbo run build --summarize

# キャッシュヒット率の確認
turbo run build --dry-run

まとめ:自社に合ったモノレポ管理を始めよう

Turborepoモノレポ管理の始め方ステップ

  1. 現状の把握:管理しているプロジェクト数と関連性を確認
  2. 小規模な試験導入:2〜3の関連プロジェクトで開始
  3. チーム内での知識共有:勉強会やドキュメント整備
  4. 段階的な拡大:成功事例をもとに他プロジェクトへ展開
  5. 継続的な改善:定期的なメンテナンスとパフォーマンス測定

小規模から始める段階的導入のすすめ

最初から全プロジェクトをモノレポ化するのではなく、以下のような順序で進めましょう。

フェーズ1(1〜2ヶ月)
- 顧客向けサイト + 管理画面の2プロジェクトで開始
- 共通UIコンポーネントの抽出

フェーズ2(3〜4ヶ月)
- モバイルアプリの追加
- 共通ユーティリティ関数の整理

フェーズ3(5〜6ヶ月)
- すべての関連プロジェクトを統合
- リモートキャッシュの本格活用

困ったときの相談先・サポート体制

公式リソース
- Turborepo公式ドキュメント
- GitHubディスカッション

外部サポートの活用

社内リソースだけで難しい場合は、外部の専門家に相談することも有効です。Harmonic Societyでは、中小企業向けにモノレポ導入支援サービスを提供しています。

  • 初期セットアップの支援
  • チームメンバーへのトレーニング
  • 運用フェーズでの技術サポート

「ちょうどいい」規模と複雑さで、無理なく導入できる体制づくりをお手伝いします。

Turborepoによるモノレポ管理は、中小企業の開発効率を大きく向上させる可能性を秘めています。まずは小さく始めて、自社に合った形で育てていきましょう。

#モノレポ#Turborepo#管理
共有:

ちょっとした業務の悩みも、気軽にご相談ください。

まずは話だけ聞いてもらう