pnpm 11.28.11
pnpm 11.28.11 fixes frozen installs with excludeLinksFromLockfile, pnpm link in workspaces, pnpm deploy with dangling symlinks, and verifyDepsBeforeRun starting needless installs.
Patch Changes#
Installing packages#
-
pnpm deploynow keeps a symlink in the project whose target is missing from the source, such as a link into anode_modulesdirectory that was removed after the build. Deploy used to fail withENOENTon such a link #17571. -
A package with
bundledDependenciesand a build script now keeps its bundled dependencies when it is restored from the side-effects cache #17523. -
pnpm installnow links the runtime that an earlierpnpm install --no-runtimeskipped #17542. -
Commands of a package whose
binpaths contain excess parent directory segments, such as../dist/cli.js, are no longer missing. Such paths now resolve inside the package #17586. -
Generated POSIX shell shims now quote their paths, so shell special characters in a path stay literal.
-
A repeat
pnpm installnow rewrites the bin shims afterextendNodePathchanges. Before, it reported "Already up to date" and the shims kept theNODE_PATHof the previous setting.
Lockfile and resolution#
-
pnpm install --frozen-lockfilenow accepts the lockfile it wrote withexcludeLinksFromLockfileandlinkWorkspacePackageson, when a project depends on a workspace package through a plain version range or acatalog:entry. It used to fail withERR_PNPM_OUTDATED_LOCKFILE. -
pnpm install --frozen-lockfile,pnpm approve-builds, andpnpm rebuildnow accept a lockfile that resolves a*dependency to a prereleaselatestversion. pnpm wrote such a lockfile and then reported it as outdated #17594. -
Packages from the default registry keep plain lockfile keys, even when a prefix such as
npmjspoints at the registry set asregistry. A dependency written with such a prefix shares the plain entry of the same package. The next install rewrites keys that earlier versions qualified this way #17575. -
Relative local paths in root
overridesnow resolve from the workspace root when each project has its own lockfile #17691.Installing a local directory dependency no longer fails when another project's install is writing a lockfile in that directory.
-
Peer deduplication no longer gives a project different copies of a dependency across direct and transitive paths when an optional peer has no provider #17666.
-
A Node.js version range such as
>=26.13, for example indevEngines.runtime, now resolves to the newest stable release that satisfies it. pnpm picks a prerelease only when no stable release matches #17516.
verifyDepsBeforeRun#
-
With
verifyDepsBeforeRun,pnpm runandpnpm execnow report dependencies as out of date after a dependency is added to thepackage.jsonof a local directory dependency, such as"lib": "file:../lib". Before, the command ran without the new dependency installed. -
verifyDepsBeforeRunno longer reports dependencies as out of sync when only theversionfield of a single-project repository changed #17560. The same holds for a workspace project that no dependency can resolve to. A script run after such a change no longer starts an install first.
pnpm link#
-
In a workspace,
pnpm link <dir>now adds thelink:dependency to thepackage.jsonof the project where the command runs, not to the workspace root'spackage.json. The link is created in that project'snode_modules, as documented. The override is still written to the rootpnpm-workspace.yaml. -
pnpm linkwith several paths now records every linked package in theoverridesofpnpm-workspace.yaml. Some of them could be missing before. -
pnpm linknow fails without changingpackage.jsonorpnpm-workspace.yamlwhen the linked package's name is not a valid npm package name. It used to write that name to both files, which made every later install fail #17475.
pnpm update#
-
pnpm updatewith only negated selectors, such aspnpm update '!foo', now leaves the dependencies listed inupdate.ignoreDepsunchanged pnpm/tasks#243. -
pnpm update --depth 0without selectors now does nothing when every direct dependency is listed inupdate.ignoreDeps. Before, it failed withERR_PNPM_NO_PACKAGE_IN_DEPENDENCIESpnpm/tasks#251.
Store and self-update#
-
pnpm store prunenow keeps packages linked from a configured modules directory pnpm/tasks#230. -
pnpm store statusno longer reports untouched packages as modified when the global virtual store is enabled. If the installed global-store layout cannot be verified, the command reportsERR_PNPM_STORE_STATUS_UNVERIFIABLEand asks for a reinstall #17631. -
pnpm store addnow fails right away withERR_PNPM_FROZEN_STORE_WRITEwhenfrozenStoreis enabled. It used to retry each download for minutes before failing, or fail with a SQLite error on an empty store. -
pnpm self-updatenow reinstalls a cached engine if its executable cannot run. This repairs shared store entries damaged by an earlier install #17582.