mirror of
https://github.com/pnpm/action-setup
synced 2026-05-05 03:07:48 +02:00
fix: append (not prepend) action node dir to PATH for npm bootstrap
#239 prepended `dirname(process.execPath)` to PATH so npm's `#!/usr/bin/env node` shebang resolves on GHE self-hosted runners where node isn't on PATH. But on runners with a prior `setup-node` step, this shadowed the user's installed toolchain with the runner-bundled node (e.g. externals/node24/bin), pairing the user's npm with a mismatched node — or picking up a broken `npm` shipped next to the runner-bundled node. Append instead so a user-installed toolchain on PATH keeps precedence; the runner's node dir remains as a fallback for the original #234 case where node isn't on PATH at all. Fixes #240
This commit is contained in:
2
dist/index.js
vendored
2
dist/index.js
vendored
File diff suppressed because one or more lines are too long
@@ -29,16 +29,20 @@ export async function runSelfInstaller(inputs: Inputs): Promise<number> {
|
|||||||
await writeFile(path.join(dest, 'package.json'), packageJson)
|
await writeFile(path.join(dest, 'package.json'), packageJson)
|
||||||
await writeFile(path.join(dest, 'package-lock.json'), JSON.stringify(lockfile))
|
await writeFile(path.join(dest, 'package-lock.json'), JSON.stringify(lockfile))
|
||||||
|
|
||||||
// Prepend the action's node directory to PATH so npm's
|
// Append the action's node directory to PATH so npm's
|
||||||
// `#!/usr/bin/env node` shebang resolves on runners (e.g. GHE
|
// `#!/usr/bin/env node` shebang resolves on runners (e.g. GHE
|
||||||
// self-hosted) where node isn't already on PATH. npm itself is
|
// self-hosted) where node isn't already on PATH. Append (not
|
||||||
// resolved via PATH — on the GitHub Actions runner it is not
|
// prepend) so a user-installed toolchain on PATH — e.g. from a
|
||||||
// co-located with `process.execPath`.
|
// prior `setup-node` step — keeps precedence; otherwise the
|
||||||
|
// runner-bundled node would shadow it and pair the user's npm
|
||||||
|
// with a mismatched node version. npm itself is resolved via
|
||||||
|
// PATH — on the GitHub Actions runner it is not co-located with
|
||||||
|
// `process.execPath`.
|
||||||
const nodeDir = path.dirname(process.execPath)
|
const nodeDir = path.dirname(process.execPath)
|
||||||
// On Windows, the PATH key casing varies; search case-insensitively.
|
// On Windows, the PATH key casing varies; search case-insensitively.
|
||||||
const pathKey = Object.keys(process.env).find(k => k.toUpperCase() === 'PATH') ?? 'PATH'
|
const pathKey = Object.keys(process.env).find(k => k.toUpperCase() === 'PATH') ?? 'PATH'
|
||||||
const currentPath = process.env[pathKey]
|
const currentPath = process.env[pathKey]
|
||||||
const npmEnv = { ...process.env, [pathKey]: currentPath ? nodeDir + path.delimiter + currentPath : nodeDir }
|
const npmEnv = { ...process.env, [pathKey]: currentPath ? currentPath + path.delimiter + nodeDir : nodeDir }
|
||||||
const npmExitCode = await runCommand('npm', ['ci'], { cwd: dest, env: npmEnv })
|
const npmExitCode = await runCommand('npm', ['ci'], { cwd: dest, env: npmEnv })
|
||||||
if (npmExitCode !== 0) {
|
if (npmExitCode !== 0) {
|
||||||
return npmExitCode
|
return npmExitCode
|
||||||
|
|||||||
Reference in New Issue
Block a user