🏢 モノレポで複数プロジェクト管理

1つの GitHub リポジトリで複数の Cloudflare Pages サイトを管理

📁 モノレポのファイル構造

複数のプロジェクトを1つの GitHub リポジトリで管理する際の推奨されるディレクトリ構造です。各プロジェクトは独立した Cloudflare Pages デプロイを持ちます。

monorepo-demo/ ├── packages/ │ ├── landing/ ← ランディングページ │ │ ├── index.html 📄 メインページ │ │ ├── styles.css 🎨 スタイル │ │ ├── script.js ⚙️ ロジック │ │ └── images/ 🖼️ 画像資産 │ │ │ ├── blog/ ← ブログサイト │ │ ├── index.html │ │ ├── posts/ │ │ │ ├── post-1.html │ │ │ └── post-2.html │ │ ├── build.sh 🔨 ビルドスクリプト │ │ └── package.json │ │ │ ├── api/ ← バックエンド API │ │ ├── functions/ │ │ │ ├── api/ │ │ │ │ ├── users.js │ │ │ │ └── posts.js │ │ │ └── middleware.js │ │ └── package.json │ │ │ └── shared/ ← 共有ユーティリティ │ ├── utils.js │ ├── constants.js │ └── package.json │ ├── .github/ │ └── workflows/ │ └── deploy.yml 🚀 CI/CD ワークフロー │ └── package.json 📦 ルートパッケージ設定

⚙️ 各プロジェクトの個別設定

🌐 ランディングページ

静的 HTML で構築したランディングページです。最小限の設定で即座にデプロイされます。
Project Name: monorepo-landing
Build command: (空白)
Build output: packages/landing
Watch paths: packages/landing/**

📝 ブログサイト

Markdown から HTML を生成するスタティックサイトジェネレータを使用。ビルドプロセスが必要です。
Project Name: monorepo-blog
Build command: npm run build
Build output: packages/blog/dist
Watch paths: packages/blog/**

🔌 API

Cloudflare Workers Functions を使用したサーバーレス API。エッジネットワークで実行されます。
Project Name: monorepo-api
Build command: npm run build
Build output: packages/api
Watch paths: packages/api/**

🔍 パス監視(Path Watch)の実装

各プロジェクトは独立したパス監視を設定することで、該当フォルダの変更時のみデプロイがトリガーされます。

📊 パス監視の設定テーブル

プロジェクト Include Paths Exclude Paths
landing packages/landing/** *.test.js, node_modules/**
blog packages/blog/** node_modules/**, .git/**
api packages/api/** tests/**, *.test.js

🔗 API 経由での設定コード

# ランディングページの設定 curl -X PATCH https://api.cloudflare.com/client/v4/accounts/{account_id}/pages/projects/monorepo-landing \ -H "Authorization: Bearer {api_token}" \ -d '{ "build_config": { "path_includes": ["packages/landing/**"], "path_excludes": ["*.test.js"] } }'

🚀 デプロイワークフロー

1️⃣
Git Push
ローカルコミットを GitHub にプッシュ
2️⃣
Webhook
GitHub が Cloudflare に変更通知
3️⃣
パス検出
各プロジェクトの Include/Exclude パス確認
4️⃣
ビルド
該当プロジェクトのビルドコマンド実行
5️⃣
デプロイ
ビルド出力をエッジにデプロイ
6️⃣
公開
グローバルネットワークで配信開始

✅ パス監視の動作例

シナリオ 1: ランディングページ更新

git add packages/landing/index.html git commit -m "Update landing page design" git push origin main
✅ monorepo-landing がデプロイされます
❌ monorepo-blog と monorepo-api はスキップ(変更なし)

シナリオ 2: 複数プロジェクト同時更新

git add packages/landing/styles.css packages/blog/posts/new-post.html git commit -m "Update landing and add blog post" git push origin main
✅ monorepo-landing がデプロイされます
✅ monorepo-blog がデプロイされます
❌ monorepo-api はスキップ(変更なし)

シナリオ 3: 除外パスの変更

git add packages/api/src/utils.test.js git commit -m "Add unit tests" git push origin main
⏭️ monorepo-api はスキップされます
理由: *.test.js は Exclude paths に指定されているため

📦 共有コードの管理

packages/shared/utils.js

// 日付フォーマッター export function formatDate(date) { return new Date(date).toLocaleDateString('ja-JP'); } // API ベース URL export function getApiBaseUrl() { return process.env.API_URL || 'https://api.example.com'; } // トークン検証 export function validateToken(token, secret) { return token === secret; }

packages/landing/script.js(共有コード利用例)

import { formatDate, getApiBaseUrl } from '../shared/utils.js'; // API からデータ取得 fetch(`${getApiBaseUrl()}/greeting`) .then(r => r.json()) .then(data => { console.log('Server time:', formatDate(data.timestamp)); });

package.json(ワークスペース定義)

{ "name": "monorepo-demo", "version": "1.0.0", "workspaces": [ "packages/landing", "packages/blog", "packages/api", "packages/shared" ], "scripts": { "build": "npm --workspaces run build", "test": "npm --workspaces run test" } }

💡 ベストプラクティス

1️⃣ 明確な命名規則

プロジェクトフォルダは明確な名前で命名し、対応する Cloudflare Pages プロジェクト名と統一しましょう。

2️⃣ 環境ごとの設定

本番環境とプレビュー環境で異なる環境変数を設定できます。各プロジェクトの Settings で管理します。

3️⃣ CI/CD の活用

GitHub Actions で自動テストを実施し、品質保証を行います。テスト失敗時は自動デプロイをスキップできます。

4️⃣ パス監視の最適化

テストファイルやログ、node_modules は Exclude paths に指定し、不要なデプロイトリガーを防ぎましょう。

5️⃣ 依存関係の共有

npm workspaces を利用して、共有パッケージの依存関係をルートレベルで統一管理できます。

6️⃣ ドメイン管理

各プロジェクトにカスタムドメインを割り当て、ユーザーフレンドリーな URL 構造を構築します。

🎯 次のステップ

このモノレポパターンを使用することで、複数のサイトを効率的に管理できます。
各プロジェクトは独立したデプロイサイクルを持ちながら、共有コードと依存関係を活用できます。

推奨される実装順序:
1. GitHub でモノレポを作成 → 2. package.json にワークスペース定義 → 3. Cloudflare Pages で各プロジェクトを接続 → 4. パス監視を設定 → 5. CI/CD パイプラインを構築