Files
vercel__next.js/scripts/create-next-bin-placeholder.mjs
T
Benjamin Woodruff 1eab3361c7 fix: Use a pnpm preinstall script to fix catch-22 in next binary creation (#91016)
We've had a longstanding issue where you'd have to run `pnpm i` _twice_ on a fresh checkout because `pnpm` wouldn't set up binary symlinks until after the binary exists, but the binary wouldn't exist until after `pnpm build` was done:

https://github.com/vercel/next.js/blob/canary/.github/workflows/build_reusable.yml#L303-L311

This solves that problem using a pnpm preinstall script that creates stub binaries for these files if they don't exist yet (because we haven't run `pnpm build`).

## Test Plan

```
git clean -fxd
pnpm i
pnpm build
pnpm test-start test/e2e/app-dir/next-image/
pnpm test-start-turbo test/e2e/app-dir/next-image/
```

I tested this both locally and inside of a fresh ubuntu VM.

Running `pnpm next` after `pnpm i` but before `pnpm build` gives a helpful error message:

<img width="946" height="125" alt="Screenshot 2026-03-06 at 9 37 14 PM" src="https://github.com/user-attachments/assets/4517e8bd-60ca-44f2-a34c-f7f3ec56c634" />
2026-03-10 11:21:15 -07:00

43 lines
883 B
JavaScript

import fs from 'node:fs'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
const scriptDir = path.dirname(fileURLToPath(import.meta.url))
const repoRoot = path.join(scriptDir, '..')
const placeholders = [
path.join(repoRoot, 'packages', 'next', 'dist', 'bin', 'next'),
path.join(repoRoot, 'packages', 'create-next-app', 'dist', 'index.js'),
path.join(
repoRoot,
'turbopack',
'packages',
'devlow-bench',
'dist',
'cli.js'
),
]
for (const binPath of placeholders) {
if (fs.existsSync(binPath)) {
continue
}
fs.mkdirSync(path.dirname(binPath), { recursive: true })
fs.writeFileSync(
binPath,
`#!/usr/bin/env node
console.error(
"Local workspace has not been built yet. Run 'pnpm build' first."
)
process.exit(1)
`,
'utf8'
)
if (process.platform !== 'win32') {
fs.chmodSync(binPath, 0o755)
}
}