pnpmЩо нового в pnpm 12.18
Реліз додає підтримку platform variants на реєстрах pnpr, вибіркове схвалення agent skills та команду pnpm store add для офлайн-інсталяцій.
Реліз від 5 листопада 2026 · оновлено 8 листопада 2026
Головне
- Підтримка збирання, публікації та встановлення platform variants на реєстрах pnpr
- Вибіркове затвердження окремих agent skills за допомогою pnpm approve
- Команда pnpm store add для підготовки сховища до офлайн-інсталяцій із tarball-файлів
- Оптимізація повторних інсталяцій та verifyDepsBeforeRun без перечитування незмінених package.json
Коротко
Версія pnpm 12.18 додає повноцінну підтримку platform variants для реєстрів із serverType: pnpr, включаючи пакування, публікацію та встановлення специфічних для платформи архівів. Також з'явилася можливість вибірково затверджувати agent skills для окремих залежностей і команда pnpm store add для офлайн-інсталяцій із заздалегідь завантажених tarball-файлів. Крім того, повторні інсталяції та перевірки залежностей перестали перечитувати файли package.json незмінених проєктів у workspace, а також було виправлено низку помилок розділення peer-залежностей.
Нові можливості
Platform variants
Функціональність вимагає реєстру, оголошеного з конфігурацією serverType: pnpr.
- Пакування варіантів:
pnpm packстворює по одному архіву на кожен запис уpublishConfig.variantsу форматі<name>-<version>~<tag>.tgz. Прапорецьpnpm pack --variant <target>обмежує збирання лише зазначеною цільовою платформою, аpnpm pack --jsonвиводитьintegrityтаsizeдля кожного створеного архіву. - Публікація варіантів:
pnpm publishпублікує архіви зpublishConfig.variants, завантажуючи їх перед надсиланням запиту на публікацію версії. Публікація варіантів на інші типи реєстрів блокується, якщо не вказано--no-variants(який публікує лише архів для ціліany). - Роздільне завантаження архівів: команда
pnpm publish --upload-variant <target>завантажує архів у staging-зону реєстру та виводить рядок<target>=<integrity>. Наступний запускpnpm publish --variant-integrity <target>=<integrity>публікує версію на основі вже завантажених іншими завданнями архівів (з прапорцем--recursiveформат змінюється на<name>~<target>=<integrity>). - Пакетна публікація:
pnpm publish -r --batchзавантажує кожен архів окремим запитом і пропускає ті, що вже є на реєстрі. Пакети зpublishConfig.variantsтепер підтримуються в batch-режимі. Якщо пакети посилаються на понад 256 архівів на одному реєстрі, публікація зупиняється з помилкоюERR_PNPM_BATCH_PUBLISH_TOO_MANY_ARCHIVES. - Provenance:
pnpm publish --provenanceпідписує єдине твердження для всіх архівів версії зpublishConfig.variants, де архіви позначаються package URL із кваліфікаторомvariant. - Повторний publish тієї самої версії: повторний запуск
pnpm publishзавершується успішно, якщо опублікована версія ідентична (pnpm порівнює архіви, provenance-твердження та dist-tag). Якщо версія відрізняється, виникає помилкаERR_PNPM_PUBLISHED_RELEASE_DIFFERS. - Встановлення потрібного варіанта: pnpm обирає та встановлює архів із варіантом, що відповідає поточній платформі, або власний архів пакета, якщо відповідника немає. Якщо версія містить лише варіанти без загального архіву, спроба встановити її на непідтримуваній системі призведе до пропуску опціональної залежності або до помилки зі списком доступних платформ для звичайних залежностей.
- Теги у supportedArchitectures: списки платформ у
supportedArchitecturesприймають ті самі теги платформ, що йpublishConfig.variants, включно з версіями ABI та бібліотек (наприклад,linux-x64-manylinux_2_28,darwin-arm64-macos_14_0,linux-x64-napi8,linux-x64-node127або будь-які Node.js OS/CPU на кшталтfreebsd-x64). За наявностіsupportedArchitecturespnpm завантажує в сховище варіанти для всіх зазначених систем.
Реєстри pnpr
- Зменшення обсягу метаданих: для реєстрів із
serverType: pnprpnpm не завантажує маніфести рідко використовуваних версій у великих документах пакетів, довантажуючи їх лише за потреби. Дані кешуються уv12/metadata-pnpr. Якщо реєстр є pnpr, але не оголошений як такий, pnpm видає попередження. ПараметрminimumReleaseAgeпонад 30 днів для pnpr викликає помилкуERR_PNPM_UNSUPPORTED_MINIMUM_RELEASE_AGE. - Release notes під час публікації:
pnpm publishнадсилає release notes (секцію поточної версії зCHANGELOG.mdабо нотатки, складеніpnpm version -r). Їх можна перевизначити через--release-notes <file>або вимкнути через--no-release-notes. Прапорець--publication-nameдає назву релізу в--batch. Нотатки можна переглянути черезpnpm view <pkg>@<version> releaseNotes,pnpm outdated --notesтаpnpm update --interactive.
Agent skills
- Формат посилань: посилання на навичку агента тепер називається тільки за іменем самої навички (наприклад,
.claude/skills/authзамість.claude/skills/pnpm-@acme+kit-auth). Попередні назви замінюються під час наступного встановлення. Перелік додається у блок# pnpmфайлу.gitignoreвідповідної директорії. - Вирішення колізій: якщо дві навички мають однакове ім'я або назва вже зайнята, використовується формат
pnpm-<package>-<skill>замість аварійного завершення команди. - Вибіркове затвердження:
pnpm approveзапитує, які саме навички зв'язувати, якщо пакет містить декілька, і записує вибір у конфігурацію видуpermissions.<pkg>.skills: [guide, migrate]. Під час першого схвалення також запитуються цільові директорії агентів (зберігаються вskills.dirs). - Вкладені директорії: підтримуються навички, вкладені в підпапки категорій (наприклад,
skills/engineering/implement/SKILL.md) на глибину до трьох рівнів нижчеskills/.
Сховище та хуки
- Команда pnpm store add: підготовлює сховище до роботи без мережі за допомогою локальних архівів. Після виконання
pnpm store add ./tarballs/*.tgzкомандаpnpm install --offline --frozen-lockfileвстановлює пакети, зафіксовані в lockfile на ці архіви. - Власні fetcher-хуки: для кастомних pnpmfile стали доступні
fetchers.gitHostedTarball,fetchers.gitтаfetchers.binary.
Виправлення та покращення
- Швидкодія та перевірки:
pnpm install, а такожpnpm runтаpnpm execз увімкненимverifyDepsBeforeRun, більше не зчитуютьpackage.jsonпроєктів workspace, чиї файли не змінювалися після останнього встановлення. У воркспейсі на 300 проєктів ізsharedWorkspaceLockfile: falseчас виконанняpnpm -r exec trueскоротився з 490 мс до 42 мс. - Підготовка середовища: усунуто зависання
nodeабоpnpm installпід час завантаження ще не завантаженої версії Node.js у конфігураціях зglobalPnpmfile. - Global virtual store: виправлено помилки
ERR_PNPM_CMD_SHIM_SYMLINK_BINпід час паралельних інсталяцій на етапі створення посилань на виконувані файли; виправлено роботу інсталяцій на Windows для залежностей з іменованих реєстрів (gh:,npmjs:); знову запускаються build-скрипти залежностей (наприклад, інсталятори git-хуків), якщо слот у глобальному сховищі вже був зібраний іншим проєктом. - Робота з lockfile: ключі залежностей за замовчуванням залишаються чистими навіть при використанні префіксів на кшталт
npmjs;pnpm install --frozen-lockfileкоректно обробляє залежності*, що резолвляться в пререлізнийlatest, зв'язки черезcatalog:приexcludeLinksFromLockfile, а також конфігурацію зaddMissingPeerTypes. - Локальні шляхи: відносні шляхи в кореневих
overridesта каталогах коректно резолвляться від кореня workspace за наявності ізольованих lockfile для кожного проєкту. - Дедуплікація:
pnpm dedupe --checkне змінюєpnpm-lock.yamlпід час аналізу та не падає, якщо відмінність полягає лише в оновленому алгоритмі integrity (наприклад,sha512замістьsha1). - Peer-залежності: виправлено помилки дедуплікації та прив'язки варіантів peer-залежностей до інших проєктів за відсутності провайдера або наявності вкладених peer-пакетів. Додано попередження в
pnpm peers check, якщо обов'язковий peer резолвиться без провайдера приautoInstallPeers: falseтаdedupePeerDependents: true. - Розгортання та CLI:
pnpm deployзберігає symlink, ціль якого зникла з джерела (наприклад, посилання на видаленуnode_modules); виправлено пошук команд у директоріяхbinіз надлишковими відносними сегментами (наприклад,../dist/cli.js); шел-шипи POSIX тепер екранують шляхи лапками.
Огляд підготовлено автоматично за офіційними release notes за допомогою ШІ та перевірено на відповідність джерелу. Точні формулювання дивіться в оригіналі. Як ми працюємо