Перейти до основного змісту

pnpm 10.16

· 3 хв читання
Золтан Кочан
Головний розробник pnpm

Незначні зміни

Новий параметр для відкладеного оновлення залежностей

Останнім часом було кілька інцидентів, коли популярні пакунки були успішно атаковані. Щоб зменшити ризик встановлення скомпрометованої версії, ми вводимо новий параметр, який затримує встановлення щойно випущених залежностей. У більшості випадків такі атаки виявляються швидко, а шкідливі версії видаляються з реєстру протягом години.

Новий параметр називається minimumReleaseAge. Він визначає кількість хвилин, які мають пройти після публікації версії, перш ніж pnpm її встановить. Наприклад, встановлення значення minimumReleaseAge: 1440 гарантує, що можна буде встановити лише пакунки, випущені принаймні один день тому.

Якщо ви встановили minimumReleaseAge, але вам потрібно вимкнути це обмеження для певних залежностей, ви можете перерахувати їх у налаштуванні minimumReleaseAgeExclude. Наприклад, з такою конфігурацією pnpm завжди встановлюватиме останню версію webpack, незалежно від часу її випуску:

minimumReleaseAgeExclude:
- webpack

Див. тікет: #9921.

Розширена фільтрація залежностей за допомогою функцій пошуку

Додано підтримку пошуку.

У минулому pnpm list та pnpm why могли шукати залежності лише за назвою (і, опціонально, за версією). Наприклад:

pnpm why minimist

виводить ланцюжок залежностей для будь-якого встановленого екземпляра minimist:

verdaccio 5.20.1
├─┬ handlebars 4.7.7
│ └── minimist 1.2.8
└─┬ mv 2.1.1
└─┬ mkdirp 0.5.6
└── minimist 1.2.8

Що робити, якщо ми хочемо шукати за іншими властивостями залежності, а не лише за її назвою? Наприклад, знайти всі пакунки, які мають 'react@17' у своїх прямих залежностях?

Тепер це можливо завдяки "функціям пошуку". Функції пошуку можна оголосити у файлі .pnpmfile.cjs та викликати з прапорцем --find-by=<function name> під час виконання команд pnpm list або pnpm why.

Припустимо, нам потрібно знайти будь-які залежності, які містять React 17 у прямих залежностях. Ми можемо додати цей пошук до нашого .pnpmfile.cjs:

module.exports = {
finders: {
react17: (ctx) => {
return ctx.readManifest().peerDependencies?.react === "^17.0.0";
},
},
};

Тепер ми можемо використовувати цю функцію пошуку, виконавши:

pnpm why --find-by=react17

pnpm знайде всі залежності, які мають цей React в прямих залежностях, і виведе їх точне розташування в графі залежностей.

@apollo/client 4.0.4
├── @graphql-typed-document-node/core 3.2.0
└── graphql-tag 2.12.6

Також можна вивести деяку додаткову інформацію у вивід, повернувши рядок з пошуку. Наприклад, за допомогою наступного пошуку:

module.exports = {
finders: {
react17: (ctx) => {
const manifest = ctx.readManifest();
if (manifest.peerDependencies?.react === "^17.0.0") {
return `license: ${manifest.license}`;
}
return false;
},
},
};

Кожен пакунок, що відповідає цьому параметру, також виведе ліцензію зі свого package.json:

@apollo/client 4.0.4
├── @graphql-typed-document-node/core 3.2.0
│ license: MIT
└── graphql-tag 2.12.6
license: MIT

Див. PR: #9946.

Зміни в патчах

  • Виправлено попередження про застаріле програмне забезпечення, яке виводиться під час виконання pnpm за допомогою Node.js 24 #9529.
  • Викинути помилку, якщо nodeVersion не встановлено на точну версію semver #9934.
  • Команда pnpm publish повинна мати можливість публікувати файл .tar.gz #9927.
  • Скасування запущеного процесу за допомогою Ctrl-C має призвести до того, що pnpm run поверне ненульовий код завершення #9626.