モノレポでのスコープ付きコミット

モノレポプロジェクトでスコープを効果的に使う方法を学びます。パッケージベースのスコーピング、ワークスペースの命名規則、パッケージ間でのコミットメッセージの構造化を解説します。

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つのオプションがあります:

  1. スコープを省略(変更が真に横断的な場合):

    build: upgrade Node.js to v20 across all packages
    
  2. 影響を受けるパッケージをボディに記載

    refactor: standardize error handling
    
    Affected packages: core, api, web
    Replace custom error classes with shared AppError
    from @myorg/core in all server-side packages.
    

ツール連携

lernanxchangesetsなどのツールは、スコープ付きコミットを使って:

  • パッケージごとのchangelogを生成
  • どのパッケージにバージョンバンプが必要か判断
  • パッケージ固有のCIパイプラインをトリガー
  • 選択的テストのために影響を受けるパッケージを特定

ユースケース

Webフロントエンド、APIサーバー、共有ユーティリティライブラリの個別パッケージを持つモノレポを管理しています。APIサーバーの認証ミドルウェアのバグを修正し、CIパイプラインが影響を受けるパッケージのテストのみを実行するように、どのパッケージが変更されたかを明確に識別するコミットメッセージが必要です。

試してみる — Git Commit Message Generator

フルツールを開く