できない.dev

Vercel で monorepo のルートディレクトリが検出されずビルドが失敗する

Turborepo / pnpm workspace / Nx などの monorepo を Vercel にデプロイすると、プロジェクトルートではなく monorepo のトップで実行され `No Next.js version detected` 等で落ちる。
Root Directory・Build Command・Install Command の 3 つを正しく組む。

#vercel#monorepo#build#turborepo

公開:

要約

Vercel は monorepo を自動検出しようとするが、Turborepo / pnpm workspace / Nx の組み合わせや非標準ディレクトリでは Root Directory を手動指定しないと正しく動かない。
Project Settings の Root Directory、Build Command、Install Command の 3 つを揃えるのが基本。
詳細は 公式 monorepo ドキュメント を参照。

よくある原因

  1. Root Directory 未設定: monorepo トップのまま検出に任せると Next.js / Remix 等のバージョン検出で失敗する
  2. Build Command がワークスペース未対応: npm run build が対象アプリのスクリプトを呼べない
  3. Install Command の不一致: pnpm を使っているのに npm install のままで lockfile / node_modules が壊れる
  4. Output Directory の取り違え: ルートで build した想定の .next を Vercel が探しに行く

解決策

1. Root Directory を設定する

Vercel ダッシュボード → Project Settings → General → Root Directory に apps/web などデプロイ対象のパスを入れる。
これだけで Next.js / Remix 等は通常正しく検出される。

2. ワークスペース対応の Build Command

Turborepo を使うなら、ルートから filter 指定でビルドする。

cd ../.. && pnpm turbo run build --filter=web

Turborepo on Vercel ドキュメント では turbo build --filter={app}... 形式が推奨されている。

3. Install Command を明示する

pnpm install --frozen-lockfile

Vercel は lockfile からパッケージマネージャを推測するが、複数 lockfile が混在すると失敗する。
Project Settings → Build & Development Settings で明示する。

4. vercel.json で固める

{
  "buildCommand": "cd ../.. && pnpm turbo run build --filter=web",
  "installCommand": "pnpm install --frozen-lockfile",
  "outputDirectory": ".next"
}

Project Configuration リファレンス を参照。

この記事は役立ちましたか?