Change8

v11.0.0-beta.4

Breaking Changes
📦 pnpmView on GitHub →
17 breaking9 features1 deprecations🔧 10 symbols

Summary

This release introduces significant internal changes, including a new SQLite-based store index format (Store v11) and isolated global package installations for better stability. Configuration handling has been overhauled, moving away from rc files and standardizing CLI output formats to

⚠️ Breaking Changes

  • pnpm no longer populates `npm_config_*` environment variables from the pnpm config during lifecycle scripts. Only well-known `npm_*` env vars are set, matching Yarn's behavior. Users relying on specific `npm_config_*` variables must update scripts to use pnpm config settings directly or environment variables set outside of pnpm.
  • The standalone exe version of pnpm requires at least glibc 2.27.
  • The `pnpm install -g` command (without arguments) is no longer supported; use `pnpm add -g <pkg>` instead for global package management.
  • `pnpm config get` (without `--json`) no longer prints INI formatted text; it now prints JSON for objects/arrays and raw values for primitives. `pnpm config get --json` behavior is unchanged.
  • `pnpm config list` now prints a JSON object instead of INI formatted text.
  • `pnpm config list` and `pnpm config get` (without argument) now hide auth-related settings and show top-level keys as camelCase (unless starting with @ or //).
  • `pnpm config get` and `pnpm config list` no longer load non camelCase options from the workspace manifest (`pnpm-workspace.yaml`).
  • pnpm no longer loads non-auth and non-registry settings from rc files. Other settings must be defined in `pnpm-workspace.yaml`. Move configuration from rc files to `pnpm-workspace.yaml` if needed.
  • Workspace project specific `.npmrc` files are replaced by the `packageConfigs` field in `pnpm-workspace.yaml`. Migrate configurations from `.npmrc` to `packageConfigs` in the workspace manifest.
  • The deprecated build dependency settings (`onlyBuiltDependencies`, `onlyBuiltDependenciesFile`, `neverBuiltDependencies`, and `ignoredBuiltDependencies`) are removed. Use the `allowBuilds` setting instead.
  • The deprecated `allowNonAppliedPatches` is completely removed in favor of `allowUnusedPatches`. Replace usage of `allowNonAppliedPatches` with `allowUnusedPatches`. `ignorePatchFailures` is removed; all patch application failures will now throw an error.
  • The `pnpm server` command has been removed.
  • Support for the `useNodeVersion` and `executionEnv.nodeVersion` fields is removed. Use `devEngines.runtime` and `engines.runtime` instead.
  • Support for `hooks.fetchers` is removed. Use the new API via the `fetchers` field of `pnpmfile` for custom fetchers and resolvers.
  • The default value of the `type` field in the `package.json` file initialized by `pnpm init` is changed to `module`.
  • Lowercase options `-d` and `-p` have new meanings when used with `pnpm add`: `-p` is now an alias for `--save-prod` (was `--parseable`), and `-d` is now an alias for `--save-dev` (was `--loglevel=info`).
  • The One-time Password feature for `pnpm publish` now reads from `PNPM_CONFIG_OTP` instead of `NPM_CONFIG_OTP`.

Migration Steps

  1. If you relied on `npm_config_*` environment variables in lifecycle scripts, update scripts to use pnpm configuration methods or external environment variables.
  2. If using the standalone pnpm executable, ensure your system has at least glibc 2.27.
  3. Replace usage of `pnpm install -g` with `pnpm add -g <pkg>` to manage global packages.
  4. Review configuration output from `pnpm config get` and `pnpm config list` as the format has changed to JSON/raw values.
  5. If you used deprecated build dependency settings (`onlyBuiltDependencies`, etc.), replace them with the `allowBuilds` map in configuration files.
  6. Replace usage of deprecated `allowNonAppliedPatches` with `allowUnusedPatches` in configuration.
  7. Update scripts that relied on `useNodeVersion` or `executionEnv.nodeVersion` to use `devEngines.runtime` or `engines.runtime`.
  8. Update custom fetcher/resolver implementations to use the `fetchers` field in `pnpmfile` instead of `hooks.fetchers`.
  9. If using `pnpm add`, note that `-p` now means `--save-prod` and `-d` now means `--save-dev`.
  10. For publishing requiring OTP, set the `PNPM_CONFIG_OTP` environment variable instead of `NPM_CONFIG_OTP`.

✨ New Features

  • CLI now uses cleaner output for script execution, printing `$ command` to stderr.
  • During install, pnpm suggests running `pnpm peers check` to view peer dependency issues instead of rendering the full tree.
  • Runtime dependencies are always linked from the global virtual store by default for global installs and `pnpm dlx` (can be disabled via `enableGlobalVirtualStore: false`).
  • Global packages are now isolated: each globally installed package (or group) gets its own installation directory with its own `package.json`, `node_modules/`, and lockfile to prevent interference.
  • Default value for `optimisticRepeatInstall` is changed to `true`.
  • Default value for `verifyDepsBeforeRun` is changed to `install`.
  • The `allowBuilds` setting is introduced to control which packages can run build scripts, replacing deprecated build dependency settings.
  • Support for lowercase options `-d`, `-p`, `-o`, `-e` in `pnpm add` command.
  • `pnpm publish` now works without the `npm` CLI.

Affected Symbols

⚡ Deprecations

  • Node.js v18, 19, 20, and 21 support is discontinued.