モノレポでのスコープ付きコミット
モノレポプロジェクトでスコープを効果的に使う方法を学びます。パッケージベースのスコーピング、ワークスペースの命名規則、パッケージ間でのコミットメッセージの構造化を解説します。
Scoped Commits
詳細な説明
モノレポのコミットスコーピング
モノレポでは、複数のパッケージやアプリケーションが単一のリポジトリに存在します。各コミットがどのパッケージに影響するかを識別するために、スコープが不可欠になります。これにより、パッケージごとのchangelog、独立したバージョニング、ターゲットを絞ったCIパイプラインが可能になります。
メッセージの例
feat(web): add dark mode toggle to settings page
fix(api): resolve memory leak in WebSocket handler
build(shared): upgrade TypeScript to 5.4
スコープの命名戦略
パッケージ名をスコープとして使用
パッケージディレクトリまたはnpmパッケージ名を使用:
packages/
core/ → scope: core
cli/ → scope: cli
web-app/ → scope: web-app
api-server/ → scope: api-server
省略スコープ
長いパッケージ名には、チームで合意した省略形を使用:
feat(web): ... → packages/web-app
fix(api): ... → packages/api-server
build(sdk): ... → packages/client-sdk
パッケージ間の変更
コミットが複数のパッケージに影響する場合、2つのオプションがあります:
スコープを省略(変更が真に横断的な場合):
build: upgrade Node.js to v20 across all packages影響を受けるパッケージをボディに記載:
refactor: standardize error handling Affected packages: core, api, web Replace custom error classes with shared AppError from @myorg/core in all server-side packages.
ツール連携
lerna、nx、changesetsなどのツールは、スコープ付きコミットを使って:
- パッケージごとのchangelogを生成
- どのパッケージにバージョンバンプが必要か判断
- パッケージ固有のCIパイプラインをトリガー
- 選択的テストのために影響を受けるパッケージを特定
ユースケース
Webフロントエンド、APIサーバー、共有ユーティリティライブラリの個別パッケージを持つモノレポを管理しています。APIサーバーの認証ミドルウェアのバグを修正し、CIパイプラインが影響を受けるパッケージのテストのみを実行するように、どのパッケージが変更されたかを明確に識別するコミットメッセージが必要です。