Vercel で monorepo のルートディレクトリが検出されずビルドが失敗する
Turborepo / pnpm workspace / Nx などの monorepo を Vercel にデプロイすると、プロジェクトルートではなく monorepo のトップで実行され `No Next.js version detected` 等で落ちる。
Root Directory・Build Command・Install Command の 3 つを正しく組む。
公開:
要約
Vercel は monorepo を自動検出しようとするが、Turborepo / pnpm workspace / Nx の組み合わせや非標準ディレクトリでは Root Directory を手動指定しないと正しく動かない。
Project Settings の Root Directory、Build Command、Install Command の 3 つを揃えるのが基本。
詳細は 公式 monorepo ドキュメント を参照。
よくある原因
- Root Directory 未設定: monorepo トップのまま検出に任せると Next.js / Remix 等のバージョン検出で失敗する
- Build Command がワークスペース未対応:
npm run buildが対象アプリのスクリプトを呼べない - Install Command の不一致: pnpm を使っているのに
npm installのままで lockfile / node_modules が壊れる - 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=webTurborepo on Vercel ドキュメント では turbo build --filter={app}... 形式が推奨されている。
3. Install Command を明示する
pnpm install --frozen-lockfileVercel は 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"
}