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プロジェクトも効率的に管理できます。