diff --git a/.changeset/spicy-panthers-agree.md b/.changeset/spicy-panthers-agree.md new file mode 100644 index 00000000000..437430dbdba --- /dev/null +++ b/.changeset/spicy-panthers-agree.md @@ -0,0 +1,7 @@ +--- +"@pnpm/config": patch +"@pnpm/plugin-commands-installation": patch +"pnpm": patch +--- + +Only the `pnpm add --global ` command should fail if there is no global pnpm bin directory in the system PATH [#5841](https://github.com/pnpm/pnpm/issues/5841). diff --git a/config/config/src/index.ts b/config/config/src/index.ts index 5ebc1dfe2cd..0d240f9a7f5 100644 --- a/config/config/src/index.ts +++ b/config/config/src/index.ts @@ -316,10 +316,6 @@ export async function getConfig ( if (pnpmConfig.bin) { fs.mkdirSync(pnpmConfig.bin, { recursive: true }) await checkGlobalBinDir(pnpmConfig.bin, { env, shouldAllowWrite: opts.globalDirShouldAllowWrite }) - } else { - throw new PnpmError('NO_GLOBAL_BIN_DIR', 'Unable to find the global bin directory', { - hint: 'Run "pnpm setup" to create it automatically, or set the global-bin-dir setting, or the PNPM_HOME env variable. The global bin directory should be in the PATH.', - }) } pnpmConfig.save = true pnpmConfig.allowNew = true diff --git a/pkg-manager/plugin-commands-installation/src/add.ts b/pkg-manager/plugin-commands-installation/src/add.ts index cd26435bfa5..be9a6cafdf5 100644 --- a/pkg-manager/plugin-commands-installation/src/add.ts +++ b/pkg-manager/plugin-commands-installation/src/add.ts @@ -193,6 +193,11 @@ export async function handler ( 'If you don\'t want to see this warning anymore, you may set the ignore-workspace-root-check setting to true.' ) } + if (opts.global && !opts.bin) { + throw new PnpmError('NO_GLOBAL_BIN_DIR', 'Unable to find the global bin directory', { + hint: 'Run "pnpm setup" to create it automatically, or set the global-bin-dir setting, or the PNPM_HOME env variable. The global bin directory should be in the PATH.', + }) + } const include = { dependencies: opts.production !== false, diff --git a/pkg-manager/plugin-commands-installation/test/add.ts b/pkg-manager/plugin-commands-installation/test/add.ts index d3d96d3da4f..d66fe50c8fe 100644 --- a/pkg-manager/plugin-commands-installation/test/add.ts +++ b/pkg-manager/plugin-commands-installation/test/add.ts @@ -1,7 +1,7 @@ import path from 'path' import { PnpmError } from '@pnpm/error' import { add, remove } from '@pnpm/plugin-commands-installation' -import { prepare, preparePackages } from '@pnpm/prepare' +import { prepare, prepareEmpty, preparePackages } from '@pnpm/prepare' import { REGISTRY_MOCK_PORT } from '@pnpm/registry-mock' import loadJsonFile from 'load-json-file' import tempy from 'tempy' @@ -330,3 +330,23 @@ test('pnpm add automatically installs missing peer dependencies', async () => { const lockfile = await project.readLockfile() expect(Object.keys(lockfile.packages).length).toBe(5) }) + +test('add: fail when global bin directory is not found', async () => { + prepareEmpty() + + let err!: PnpmError + try { + await add.handler({ + ...DEFAULT_OPTIONS, + bin: undefined as any, // eslint-disable-line + dir: path.resolve('project-1'), + global: true, + linkWorkspacePackages: false, + saveWorkspaceProtocol: false, + workspace: true, + }, ['@pnpm.e2e/hello-world-js-bin']) + } catch (_err: any) { // eslint-disable-line + err = _err + } + expect(err.code).toBe('ERR_PNPM_NO_GLOBAL_BIN_DIR') +})