Skip to content

pnpm workspaces でモノレポ化 #98

@badmintoncryer

Description

@badmintoncryer

概要

リポジトリ全体を pnpm workspaces によるモノレポ構成に再構築し、以下の構成に分離する。

+-- apps/
|   +-- cdk/                  # AWS CDK インフラ
|   +-- webapp/               # Next.js アプリ
|   +-- async-job/            # 非同期ジョブハンドラー
|   `-- migration-runner/     # DB マイグレーション
`-- packages/
    +-- db/                   # Prisma スキーマ・クライアント
    `-- shared-types/         # 共有型定義

v3ロードマップにて触れられている内容

背景・動機

現在、Next.js アプリと非同期ジョブハンドラーは単一の webapp/ パッケージに同居しているが、ビルド・デプロイは別々のアーティファクトとして行われている:

  • Dockerfile → Next.js Lambda(next build の standalone 出力)
  • job.Dockerfile → ジョブハンドラー Lambda + マイグレーション Lambda(esbuild で src/jobs/*.ts をバンドル)

これにより以下の問題が生じている:

  • 依存関係の肥大化: ジョブハンドラーの Docker イメージビルド時に npm ci で Next.js / React 等の不要な依存もすべてインストールされる
  • 単一 package.json: デプロイターゲットごとに依存関係を独立管理できない
  • migration Lambda の混在: DB マイグレーション用の migration-runner.tsjob.Dockerfile で非同期ジョブと一緒にバンドルされている。migration runner は Prisma の db push を実行するだけのインフラ寄りの処理であり、ビジネスロジックである非同期ジョブとは責務が異なるが、同一イメージに同梱されている

提案する構成

apps/

パッケージ 内容 現在の場所
apps/cdk AWS CDK インフラコード cdk/
apps/webapp Next.js アプリ(UI + Server Actions) webapp/src/app/, components/, hooks/
apps/async-job 非同期ジョブハンドラー webapp/src/jobs/async-job-runner.ts, async-job/
apps/migration-runner DB マイグレーション webapp/src/jobs/migration-runner.ts

packages/

パッケージ 内容 現在の場所
packages/db Prisma スキーマ・クライアント・マイグレーションファイル・Zod 生成型 webapp/prisma/, webapp/src/lib/prisma.ts, webapp/src/lib/generated/
packages/shared-types ジョブペイロード型、共有ユーティリティ(events, auth 等) webapp/src/lib/

依存関係の方向

apps/webapp  ──→  packages/shared-types  ←──  apps/async-job
                          │
                    packages/db
                          ↑
                  apps/migration-runner

apps/cdk は他のパッケージに直接依存しない(Docker ビルドパスのみ参照)
  • packages/db: prisma@prisma/clientzod に依存
  • packages/shared-types: packages/db@aws-sdk/*(events/auth)に依存
  • apps/webapp: packages/shared-typespackages/dbreactnextaws-amplify、UI ライブラリに依存
  • apps/async-job: packages/shared-typespackages/db@aws-sdk/client-translate に依存
  • apps/migration-runner: packages/db に依存
  • アプリ同士は相互に依存しない

共有型の整理

現在 webapp/src/lib/jobs.ts@/jobs/async-job-runner から JobPayloadProps をインポートしてジョブ呼び出しの型安全性を確保している。分離後は:

  • JobPayloadProps 型とペイロードスキーマを packages/shared-types に移動し、apps/webappapps/async-job の両方から参照可能にする
  • apps/webapp は Lambda 呼び出し時の型として使用、apps/async-job は受信イベントのバリデーションに使用

技術的アプローチ

pnpm Workspaces

pnpm-workspace.yaml でモノレポを定義:

packages:
  - "apps/*"
  - "packages/*"

内部依存は workspace:* プロトコルで解決:

// apps/webapp/package.json
{ "dependencies": { "@webapp/shared-types": "workspace:*", "@webapp/db": "workspace:*" } }

// apps/async-job/package.json
{ "dependencies": { "@webapp/shared-types": "workspace:*", "@webapp/db": "workspace:*" } }

// apps/migration-runner/package.json
{ "dependencies": { "@webapp/db": "workspace:*" } }

// packages/shared-types/package.json
{ "dependencies": { "@webapp/db": "workspace:*" } }

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions