v11.0.0-beta.4
Breaking Changes📦 pnpmView on GitHub →
⚠ 17 breaking✨ 9 features⚡ 1 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
- If you relied on `npm_config_*` environment variables in lifecycle scripts, update scripts to use pnpm configuration methods or external environment variables.
- If using the standalone pnpm executable, ensure your system has at least glibc 2.27.
- Replace usage of `pnpm install -g` with `pnpm add -g <pkg>` to manage global packages.
- Review configuration output from `pnpm config get` and `pnpm config list` as the format has changed to JSON/raw values.
- If you used deprecated build dependency settings (`onlyBuiltDependencies`, etc.), replace them with the `allowBuilds` map in configuration files.
- Replace usage of deprecated `allowNonAppliedPatches` with `allowUnusedPatches` in configuration.
- Update scripts that relied on `useNodeVersion` or `executionEnv.nodeVersion` to use `devEngines.runtime` or `engines.runtime`.
- Update custom fetcher/resolver implementations to use the `fetchers` field in `pnpmfile` instead of `hooks.fetchers`.
- If using `pnpm add`, note that `-p` now means `--save-prod` and `-d` now means `--save-dev`.
- 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.