diff --git a/.github/workflows/build_reusable.yml b/.github/workflows/build_reusable.yml index a2bb5b781e225..30f04fc459a27 100644 --- a/.github/workflows/build_reusable.yml +++ b/.github/workflows/build_reusable.yml @@ -300,16 +300,6 @@ jobs: - run: ANALYZE=1 pnpm build if: ${{ inputs.skipInstallBuild != 'yes' }} - # Some packages e.g. `devlow-bench` depend on `pnpm build` to generate - # their `dist` directory. The first run of `pnpm install` will generate - # warnings because these don't exist yet. - # - # We need to run `pnpm install` a _second_ time to fix this. Fortunately, - # this second run is very fast and cheap. - - name: Re-run pnpm install to link built packages into node_modules/.bin - run: pnpm install - if: ${{ inputs.skipInstallBuild != 'yes' }} - - run: pnpm playwright install --with-deps ${{ inputs.browser }} if: ${{ inputs.skipInstallBuild != 'yes' }} diff --git a/package.json b/package.json index 2f64858d26d85..982088c122cd1 100644 --- a/package.json +++ b/package.json @@ -93,6 +93,7 @@ "clean-trace-jaeger": "node scripts/rm.mjs test/integration/basic/.next && TRACE_TARGET=JAEGER pnpm next build test/integration/basic", "debug": "cross-env NEXT_PRIVATE_LOCAL_DEV=1 NEXT_TELEMETRY_DISABLED=1 node --inspect --trace-deprecation --enable-source-maps packages/next/dist/bin/next", "debug-brk": "cross-env NEXT_PRIVATE_LOCAL_DEV=1 NEXT_TELEMETRY_DISABLED=1 node --inspect-brk --trace-deprecation --enable-source-maps packages/next/dist/bin/next", + "pnpm:devPreinstall": "node scripts/create-next-bin-placeholder.mjs", "postinstall": "node scripts/git-configure.mjs && node scripts/install-native.mjs", "version": "pnpm install --no-frozen-lockfile && git add .", "prepare": "husky", diff --git a/scripts/create-next-bin-placeholder.mjs b/scripts/create-next-bin-placeholder.mjs new file mode 100644 index 0000000000000..0fd1ccfa1d38f --- /dev/null +++ b/scripts/create-next-bin-placeholder.mjs @@ -0,0 +1,42 @@ +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) + } +} diff --git a/scripts/install-native.mjs b/scripts/install-native.mjs index 1374be3ab7080..d1854530d94df 100644 --- a/scripts/install-native.mjs +++ b/scripts/install-native.mjs @@ -60,7 +60,12 @@ import fsp from 'fs/promises' fs.writeFileSync(path.join(tmpdir, 'package.json'), JSON.stringify(pkgJson)) fs.writeFileSync(path.join(tmpdir, '.npmrc'), 'node-linker=hoisted') - const args = ['add', `next@${nextVersion}`] + const args = [ + 'add', + `next@${nextVersion}`, + '--lockfile=false', + '--ignore-workspace', + ] if (preferOffline) { args.push('--prefer-offline') }