Typescriptプロジェクトでモノレポ(monorepo)を構築する際の効率的な管理方法について解説します。モノレポは複数のパッケージやアプリケーションを1つのリポジトリで管理する手法で、コードの再利用性や開発効率を高めることができます。

モノレポの基本構成

典型的なモノレポの構造は以下のようになります:

my-monorepo/
├── packages/
│   ├── package-a/
│   │   ├── package.json
│   │   └── tsconfig.json
│   └── package-b/
│       ├── package.json
│       └── tsconfig.json
├── package.json
├── tsconfig.base.json
└── pnpm-workspace.yaml

パッケージマネージャーの選択

モノレポ管理には以下のパッケージマネージャーが推奨されます:

  • pnpm(推奨): ディスク効率が高く、ワークスペース機能が充実
  • Yarn Workspaces: 安定性が高く、広く使われている
  • npm Workspaces: npm 7以降で利用可能

pnpmを使用する場合の設定例:

# pnpm-workspace.yaml
packages:
  - 'packages/*'

TypeScript設定の共通化

ベースとなるTypeScript設定を作成し、各パッケージから参照します:

// tsconfig.base.json
{
  "compilerOptions": {
    "target": "es2020",
    "module": "esnext",
    "moduleResolution": "node",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  }
}

各パッケージのtsconfig.json:

{
  "extends": "../../tsconfig.base.json",
  "compilerOptions": {
    "outDir": "./dist",
    "rootDir": "./src"
  },
  "include": ["src/**/*"]
}

依存関係の管理

パッケージ間の依存関係は以下のように設定します:

// packages/package-b/package.json
{
  "name": "@myorg/package-b",
  "dependencies": {
    "@myorg/package-a": "workspace:*"
  }
}

ビルドとスクリプトの最適化

共通のビルドスクリプトを設定して、効率的なビルドを実現します:

// root package.json
{
  "scripts": {
    "build": "pnpm -r build",
    "test": "pnpm -r test",
    "clean": "pnpm -r clean"
  }
}

CI/CD設定

GitHub Actionsの設定例:

name: CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: pnpm/action-setup@v2
      - uses: actions/setup-node@v2
        with:
          node-version: '16'
          cache: 'pnpm'
      - run: pnpm install
      - run: pnpm build
      - run: pnpm test

パッケージの公開管理

パッケージの公開設定例:

// packages/package-a/package.json
{
  "name": "@myorg/package-a",
  "version": "1.0.0",
  "publishConfig": {
    "access": "public"
  }
}

まとめ

Typescriptプロジェクトのモノレポ管理では以下のポイントが重要です:

  • 適切なパッケージマネージャーの選択
  • TypeScript設定の共通化
  • 効率的な依存関係管理
  • ビルドプロセスの最適化
  • CI/CD設定の整備

これらの要素を適切に設定することで、大規模なTypescriptプロジェクトも効率的に管理できます。