Voydevich
pnpm

Що нового в pnpm 12.20

Оновлення експериментального lockfile v13, виправлення для nodeLinker: hoisted, покращення обробки overrides та peer-залежностей.

Реліз від 12 листопада 2026 · оновлено 12 листопада 2026

Головне

  • Запис специфікаторів локальних директорій у lockfile формату v13
  • Припинення підтримки сервера pnpr версії 0.1.0-alpha.19 та старіших
  • Оновлення вбудованого node-gyp без уразливої undici 6 (CVE-2026-84947)
  • Коректне збереження вкладених копій залежностей у nodeLinker: hoisted
  • Підтримка розділювача npm :: у фрагментах git-залежностей

Коротко

Реліз pnpm 12.20 додає запис специфікаторів для локальних залежностей із директорій в експериментальному форматі lockfile v13. Також версія містить виправлення для режиму nodeLinker: hoisted, обробки peer-залежностей та правил overrides. Крім того, оновлено вбудований node-gyp і змінено вимоги до сумісності із серверами pnpr.

Нові можливості

Експериментальний lockfile v13

  • Якщо використовується lockfile.format: v13, команда pnpm install записує специфікатори залежностей для пакетів із локальних директорій. У режимі frozen install змінені специфікатори відхиляються навіть тоді, коли зафіксовані у lockfile версії все ще відповідають новим вимогам.

Виправлення та покращення

Безпека та оновлення

  • Віддалене резолвлення (remote resolution), спільні кеші збирання (shared build caches) та завантаження release notes більше не працюють із версією pnpr 0.1.0-alpha.19 або старішими. pnpm тепер зчитує можливості сервера pnpr, вказані під pnpr.protocols, і зупиняє встановлення з помилкою, якщо сервер не підтверджує запитані політики резолвлення та перевірки.
  • Вбудований у pnpm пакет node-gyp більше не містить undici 6 (CVE-2026-84947). Також на Node.js 26 виправлено збій «invalid onError method» під час завантажень через node-gyp із використанням проксі або власного CA-файлу.

Резолвлення залежностей

  • Правила overrides із селектором версій (наприклад, "ms@^2.0.0": "2.1.1") тепер застосовуються до залежностей, оголошених за протоколом catalog:, якщо діапазон у каталозі відповідає селектору.
  • Кореневий запис overrides, який спрямовує пакет на шлях workspace: (наприклад, workspace:./packages/foo), тепер працює і у випадках, коли від цього пакета залежить пакет із реєстру.
  • У git-залежностях додано підтримку npm-розділювача :: між параметрами фрагмента (наприклад, github:owner/repo#v1.0.0::path:packages/foo). Раніше весь фрагмент сприймався як назва гілки, через що резолвлення завершувалося збоєм.
  • Команда pnpm dedupe тепер зберігає зафіксовану версію середовища виконання з devEngines.runtime або engines.runtime залежності, якщо оголошений діапазон її дозволяє. Через це pnpm dedupe --check більше не завершується помилкою після виходу нового релізу Node.js у межах дозволеного діапазону.
  • У разі використання конфігурації autoInstallPeersFromHighestMatch конфліктні non-semver peer-залежності залишаються відсутніми, а однакові специфікатори non-semver зберігаються. Бажані версії з реєстру більше не замінюють локальні шляхи або специфікатори з префіксами протоколів під час встановлення відсутніх peer-залежностей.

Режим hoisted node linker

  • У режимі nodeLinker: hoisted пакет зберігає власну вкладену копію залежності, якщо вона була зарезолвлена у версії, відмінній від верхньорівневої (включно з peer-залежностями, наданими батьківським пакетом). Раніше ця копія могла видалятися як дублікат, або верхньорівневе місце отримував peer-варіант із глибшого рівня дерева.

Lockfile та граф peer-залежностей

  • Виправлено помилку в pnpm install, через яку зберігалися застарілі прив'язки peer-залежностей після змін у дереві. Обов'язкові залежності більше не позначаються як опціональні, коли інший проєкт робочого простору видаляє спільний пакет.
  • Повторні запуски інсталяції тепер зберігають однакові зв'язки залежностей у циклічних графах із кількома варіантами peer-залежностей.
  • Виправлено запис lockfile.format: v13 для циклів залежностей із відсутніми, опціональними або транзитивними peer-пакетами. Режим frozen install тепер приймає незмінені injected-пакети, чиї peer-залежності використовують каталоги, а з прапорцем --no-optional відхиляє обов'язкові дочірні пакети з каталогів, записані лише як опціональні.
  • Команда pnpm deploy зберігає зарезолвлені залежності для injected-пакета робочого простору, якщо вони відрізняються від залежностей самого проєкту (зокрема для пакетів із publishConfig.directory).

Запуск скриптів та команди середовища виконання

  • Скрипти, запущені pnpm у власній групі процесів, тепер коректно завершуються, якщо процес pnpm було примусово зупинено одразу після їхнього старту.
  • Якщо назва команди не відповідає жодному скрипту і pnpm виконує її як команду, попереднє встановлення залежностей запускається лише один раз, а його помилки та попередження не дублюються.
  • У разі невдалого завантаження глобальними командами рантайму система тепер показує застосовану конфігурацію, а для збоїв Node.js — перелік налаштувань глобальних дзеркал і змінних оточення.

Інші зміни

  • Виправлено рідкісні падіння команди pnpm під час першого HTTPS-запиту (переважно на віртуальних машинах під керуванням Windows під навантаженням) шляхом ініціалізації випадковості TLS через системний генератор випадкових чисел.
  • Виправлено помилки конфліктів ревізій у командах pnpm deprecate, pnpm undeprecate та pnpm unpublish, коли кеш реєстру повертав застарілі метадані.
  • Команда pnpm sbom тепер повідомляє про пошкоджені маніфести в робочому просторі замість ігнорування відповідних пакетів.
  • Виправлено помилкове відображення затверджених збірок git-залежностей як змінених у pnpm store status за наявності застарілих метаданих у сховищі.
  • Додано розпізнавання Capawesome Cloud та RWX як CI-середовищ.

Огляд підготовлено автоматично за офіційними release notes за допомогою ШІ та перевірено на відповідність джерелу. Точні формулювання дивіться в оригіналі. Як ми працюємо