pnpm 12.3 ускорил большие workspace и сделал глобальные команды нативными
Патч 12.3.1 вышел через несколько часов после 12.3.0 и исправил миграцию shim после self-update.

Команда pnpm 2 сентября выпустила версию 12.3.0, а через несколько часов, уже 3 сентября, патч 12.3.1. Главное в минорном релизе: установка в больших монорепозиториях стала быстрее за счёт того, что lockfile читается во время обнаружения проектов, а глобальные команды node, deno, bun и shim, созданные через pnpm shim add, превратились в нативные исполняемые файлы на всех платформах.
Для тех, кто держит workspace на десятки пакетов, это ускорение pnpm install без изменений в конфигурации. Для пользователей Windows это ещё и конец .cmd и .ps1-обёрток: их заменяет .exe. Обратная сторона видна по патчу 12.3.1: обновление с 12.2 через self-update ломало миграцию старых shim, и это исправили в тот же день.
Ключевые выводы
- Установка в больших workspace ускорена: lockfile читается во время discovery проектов, граф workspace обрабатывается один раз вместо полного копирования lockfile.
- Контекстно-зависимые глобальные команды и shim стали нативными исполняемыми файлами; в Windows
.exeвместо.cmdи.ps1, старые shim мигрируют при следующей глобальной установке или self-update. - Флаги доверия
--trust-lockfile,--no-trust-lockfile,--trust-policy,--trust-policy-excludeи--trust-policy-ignore-afterтеперь работают и дляremoveиupdate. - Исправлено зависание
recursive runиexec, в том числе с--filterи--workspace-concurrency=1. - Системный резолвер на Linux использует
getaddrinfoи больше не должен молча обращаться к Google Public DNS при неподдерживаемой опцииno_tld_query.
Откуда взялось ускорение в монорепозиториях
По заметкам к релизу, раньше pnpm сначала обходил все проекты workspace, а потом отдельно разбирал lockfile и копировал его целиком для резолвера. В 12.3 lockfile читается уже на этапе discovery, а граф workspace строится один раз и передаётся резолверу и генератору lockfile без полного копирования. Конкретных цифр ускорения команда pnpm в заметках не приводит, формулировка звучит как «sped up installs in large workspaces»; эффект тем заметнее, чем больше пакетов и чем толще lockfile.
Что изменилось для глобальных команд и Windows
pnpm умеет ставить node, deno и bun как глобальные команды, которые подбирают версию по контексту проекта. До 12.3 в Windows такие команды были скриптами .cmd и .ps1, а на других платформах shell-обёртками. Теперь везде это нативные исполняемые файлы. Старые shim от pnpm 12 мигрируют при следующей глобальной установке или self-update; именно этот переход и сломался при обновлении с 12.2, что исправили в 12.3.1: нативный shim теперь мигрирует при первом запуске.
Безопасность: trust-флаги и скрытие секретов
Механизм доверия к lockfile появился в pnpm 12 как защита от атак на цепочку поставок: пакеты, не прошедшие политику доверия, не ставятся. В 12.2 флаги были только у install и add; 12.3 добавляет их к remove и update. Второе изменение того же ряда: учётные данные и query-параметры из URL реестров теперь скрываются в сообщениях об ошибках fetch и загрузки tarball, так что токен приватного реестра больше не утекает в лог CI при обрыве соединения.
Исправления, которые стоит знать
- Добавление локальных директорий, tarball-файлов и tarball по URL через
pnpm addснова работает. recursive runиrecursive execбольше не зависают, включая варианты с--filterи--workspace-concurrency=1.- Дочерние процессы в Windows запускаются корректно.
- Linux: системный резолвер переведён на
getaddrinfo; при неподдерживаемой опцииno_tld_queryвresolv.confpnpm больше не должен молча уходить к Google Public DNS, что важно в закрытых сетях и там, где внешние DNS фильтруются. - 12.3.1: исправлены обработка workspace anchor и параллельная проверка lockfile.
Как обновиться
Обновляться стоит сразу на 12.3.1, минуя 12.3.0. Если pnpm установлен через Corepack или npm i -g pnpm, обновление идёт обычным способом; если через self-update, после перехода с 12.2 стоит один раз запустить любую глобальную команду, чтобы shim мигрировал. Проверить, что всё на месте: pnpm --version должен показать 12.3.1, а pnpm shim ls (если пользуетесь shim) не должен ругаться на старые обёртки.
Кому обновление ничего не изменит: одиночным проектам без workspace и тем, кто не пользуется глобальными командами pnpm. Из соседних новостей про инструменты JavaScript на сайте: GitHub CLI 2.99 и Wasmi 2.0. Полный список изменений с номерами issue лежит на странице релиза.
Источники: pnpm v12.3.0 на GitHub, pnpm v12.3.1 на GitHub
Изображение на обложке: pnpm, логотип проекта











