Реклама
Перетяжка // Коробка 3.0

pnpm 12.3 ускорил большие workspace и сделал глобальные команды нативными

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

Обложка: pnpm 12.3 ускорил большие workspace и сделал глобальные команды нативными

Команда 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.conf pnpm больше не должен молча уходить к 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, логотип проекта