【TypeScript】大規模プロジェクト管理 - モノレポ戦略

【TypeScript】大規模プロジェクト管理 - モノレポ戦略

2024-10-26

2024-10-26

概要

TypeScriptを活用した大規模プロジェクト管理では、複数のパッケージやアプリケーションを一元管理するモノレポ(monorepo)戦略が有効です。従来のマルチレポジトリと異なり、すべてのコードベースを1つのリポジトリで管理するモノレポでは、プロジェクトの一貫性や効率的な依存関係管理が実現しやすくなります。本記事では、モノレポのメリットとデメリットを紹介し、TypeScriptプロジェクトでのLernaやTurborepoを使ったモノレポ導入方法について解説します。

モノレポの基本

モノレポとは

モノレポは、複数のプロジェクトやパッケージを単一のリポジトリで管理する方法です。一般的には、フロントエンドとバックエンド、共有ライブラリなどが1つのリポジトリにまとめられ、関連するコードが一箇所で管理されます。たとえば、ECサイトであれば、ユーザーインターフェース、API、バックエンドサービス、共通ユーティリティを1つのリポジトリで扱う形です。

モノレポのメリット

  • コード共有が容易
    共通コードや設定が一元化され、各プロジェクト間でのコードの再利用や、設定の統一が簡単に行えます。
  • 依存関係の管理が簡単
    パッケージ間の依存関係がリポジトリ内で見渡せるため、変更による影響を簡単に把握できます。
  • 一貫性のある開発フロー
    各プロジェクトが同一の開発フローやテストプロセスを使用できるため、作業の効率化と品質向上が期待できます。
  • 一元的な変更管理
    一つのプルリクエストで複数プロジェクトの変更を確認しやすく、特にバージョン管理やデプロイ時の統制が取りやすくなります。

モノレポのデメリット

  • リポジトリサイズが大きくなりやすい
    多くのコードが1つにまとまるため、リポジトリの容量が大きくなり、クローンやプルが重くなることがあります。
  • CI/CDパイプラインの複雑化
    すべてのプロジェクトに対してテストやビルドを行うため、CI/CDの設定が複雑になることが多いです。

TypeScriptプロジェクトにおけるモノレポ管理ツール

TypeScriptプロジェクトでモノレポを管理するには、LernaやTurborepoといったモノレポ管理ツールがよく使われます。

Lerna

Lernaは、モノレポ管理ツールとして長く利用されており、依存関係の管理に優れています。モジュール間の依存関係を明示的にし、必要なパッケージだけをビルドできる機能を持つため、特にパッケージ間での変更管理が容易です。

  1. Lernaのインストール

    npm install --global lerna
    
  2. Lernaプロジェクトの初期化 次に、lerna initコマンドで新しいプロジェクトを作成します。

    lerna init
    

    lerna.jsonファイルが生成され、モノレポ全体の設定を行います。パッケージは通常packagesディレクトリに格納され、Lernaが管理します。

  3. 各パッケージの依存関係管理 Lernaでは、各パッケージ間の依存関係を自動的に認識し、必要なパッケージだけをビルドできます。たとえば、次のコマンドで依存パッケージのインストールが行えます。

    lerna bootstrap
    
  4. 特定パッケージのビルド 変更があったパッケージだけをビルドする場合、lerna runコマンドを使用します。

    lerna run build --scope=@myorg/mypackage
    

Turborepo

Turborepoは、速度重視のモノレポ管理ツールで、キャッシュ機能と並列処理に優れ、ビルド時間の短縮に特化しています。キャッシュにより、変更のないタスクの再実行を回避できるため、プロジェクトの規模が大きくなるほど効果が発揮されます。

  1. Turborepoのインストール Turborepoをインストールするには、以下のコマンドを実行します。

    npm install turbo --save-dev
    
  2. プロジェクト設定 Turborepoではturbo.jsonという設定ファイルを使用します。このファイルで、ビルドやテストなどのタスクを指定し、それぞれの実行順序や依存関係を定義します。

    {
      "pipeline": {
        "build": {
          "dependsOn": ["^build"],
          "outputs": ["dist/"]
        },
        "test": {
          "dependsOn": ["build"]
        }
      }
    }
    
  3. キャッシュの利用 Turborepoは、ビルドキャッシュを活用するため、実行速度が速いです。キャッシュ機能を使うことで、変更がない部分のビルドをスキップし、作業効率が向上します。

    turbo run build
    
  4. TurborepoとTypeScriptの組み合わせ Turborepoは、TypeScriptプロジェクトと組み合わせることで、効率的にビルドや依存関係管理ができます。package.json内で各パッケージのビルドスクリプトを定義し、Turborepoがその順序で実行します。

    // package.json の例
    "scripts": {
      "build": "turbo run build --filter=...",
      "test": "turbo run test --filter=..."
    }
    

モノレポプロジェクトのベストプラクティス

パッケージ間の依存管理

モノレポでは、各パッケージが他のパッケージに依存していることがよくあります。LernaやTurborepoを活用することで、依存関 係の変更がある場合のみビルドやテストが実行されるように設定すると効率的です。

キャッシュと並列処理の活用

大規模なモノレポプロジェクトでは、ビルドやテストに時間がかかる場合があるため、Turborepoのキャッシュや並列処理を活用することで効率化が可能です。キャッシュは特に影響がないファイルの再ビルドを防ぐため、ビルド時間の短縮に大きく貢献します。

コードの分割と再利用

モノレポでは共通のユーティリティや関数を一元化して他のパッケージで再利用できます。これにより、コードの重複を防ぎ、メンテナンスが容易になります。

CI/CDパイプラインの最適化

CI/CDパイプラインでモノレポのワークフローを最適化することで、ビルドやテストが無駄なく実行されます。例えば、GitHub ActionsやCircleCIなどのCI/CDツールと連携し、変更のあったパッケージのみを対象にテストやデプロイが行えるようにします。

# GitHub Actionsによる一例
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Node
        uses: actions/setup-node@v2
        with:
          node-version: '16'
      - name: Install dependencies
        run: npm install
      - name: Build project
        run: npm run build --workspace=@myorg/mypackage

まとめ

TypeScriptプロジェクトにおけるモノレポ管理は、LernaやTurborepoを活用することで大規模プロジェクトの効率的な開発が可能です。モノレポは、複数のパッケージ間でコードや設定を共有しやすく、依存関係を統合し、一貫したワークフローの維持に貢献します。キャッシュや並列処理を駆使して効率化を図り、最適なモノレポ環境を構築して、スムーズなプロジェクト運営を目指しましょう。

Recommend