Параметри прямих залежностей
autoInstallPeers#
- Стандартно: true
- Тип: Boolean
Якщо true, всі відсутні необовʼязкові прямі залежності будуть автоматично встановлені.
Optional peer dependencies#
pnpm installs a missing optional peer dependency only if the workspace already has a version of it that satisfies the optional peer range. In that case, pnpm resolves the optional peer to that version. That version can come from any project in the workspace, including another project's devDependencies. For example, if one project depends on webpack and another has webpack-cli in its devDependencies, both projects get the webpack instance that has webpack-cli as its optional peer.
pnpm also resolves optional peers this way when dedupePeerDependents is true. To stop it, set both autoInstallPeers and dedupePeerDependents to false.
Version conflicts#
Якщо існують суперечливі вимоги до версій для прямої залежності з різних пакунків, pnpm не встановлюватиме автоматично жодну з версій суперечливої прямої залежності. Натомість виводиться попередження. Наприклад, якщо одна залежність вимагає react@^16.0.0, а інша — react@^17.0.0, ці вимоги конфліктують, і автоматичного встановлення не відбудеться.
Conflict resolution#
У випадку конфлікту версій вам потрібно буде визначити, яку версію прямої залежності встановити самостійно, або оновити залежності, щоб узгодити їхні вимоги до прямих залежностей.
dedupePeerDependents#
- Стандартно: true
- Тип: Boolean
Якщо цей параметр встановлено у значення true, пакунки з прямими залежностями буде дедупліковано після розвʼязання прямих залежностей.
This setting also lets pnpm resolve missing required and optional peers using compatible versions available elsewhere in the workspace, including transitive dependencies of other projects. Required peers can be resolved this way even when autoInstallPeers is false. A required peer satisfied this way is not reported as missing.
To prevent this workspace-wide peer reuse, set both autoInstallPeers and dedupePeerDependents to false. Dependencies of the workspace root can still provide peers when resolvePeersFromWorkspaceRoot is enabled.
Resolving a package's peer does not add that peer to your project's declared dependencies. If your project's scripts run a peer package's executable, declare that package directly in your project's dependencies or devDependencies.
Наприклад, скажімо, у нас є робоча область з двома проєктами, і обидва з них мають webpack у своїх залежностях. webpack має esbuild у необовʼязкових прямих залежностях, а один з проєктів має esbuild у своїх залежностях. У цьому випадку pnpm зв'яже два екземпляри webpack з текою node_modules/.pnpm: один з esbuild, а інший без нього:
node_modules
.pnpm
webpack@1.0.0_esbuild@1.0.0
webpack@1.0.0
project1
node_modules
webpack -> ../../node_modules/.pnpm/webpack@1.0.0/node_modules/webpack
project2
node_modules
webpack -> ../../node_modules/.pnpm/webpack@1.0.0_esbuild@1.0.0/node_modules/webpack
esbuild
Це має сенс, оскільки webpack використовується у двох проєктах, і в одному з них немає esbuild, тому ці два проєкти не можуть використовувати один і той самий екземпляр webpack. Однак це не те, чого очікує більшість розробників, особливо з огляду на те, що у піднятому node_modules буде лише один екземпляр webpack. Отже, тепер ви можете використовувати параметр dedupePeerDependents для дедуплікації webpack, якщо він не має конфліктні прямі залежності (пояснення у кінці). У цьому випадку, якщо ми встановимо dedupePeerDependents у true, обидва проєкти використовуватимуть той самий екземпляр webpack, який має esbuild:
node_modules
.pnpm
webpack@1.0.0_esbuild@1.0.0
project1
node_modules
webpack -> ../../node_modules/.pnpm/webpack@1.0.0_esbuild@1.0.0/node_modules/webpack
project2
node_modules
webpack -> ../../node_modules/.pnpm/webpack@1.0.0_esbuild@1.0.0/node_modules/webpack
esbuild
Що таке конфліктуючі прямі залежності? Під конфліктуючими одноранговими залежностями ми маємо на увазі сценарій, подібний до наведеного нижче:
node_modules
.pnpm
webpack@1.0.0_react@16.0.0_esbuild@1.0.0
webpack@1.0.0_react@17.0.0
project1
node_modules
webpack -> ../../node_modules/.pnpm/webpack@1.0.0_react@17.0.0/node_modules/webpack
react (v17)
project2
node_modules
webpack -> ../../node_modules/.pnpm/webpack@1.0.0_react@16.0.0_esbuild@1.0.0/node_modules/webpack
esbuild
react (v16)
У цьому випадку ми не можемо дедуплікувати webpack, оскільки webpack має react у своїх прямих залежностях, а react розвʼязується з двох різних версій у контексті двох проєктів.
dedupePeers#
Додано у: v10.33.0
- Стандартно: false
- Тип: Boolean
Якщо ця опція увімкнена, у суфіксах однорангових залежностей використовуються ідентифікатори, що містять лише версію (name@version), замість повних шляхів до залежностей, що дозволяє уникнути вкладених суфіксів на кшталт (foo@1.0.0(bar@2.0.0)). This reduces the number of package instances in projects with many recursive peer dependencies.
Це відрізняється від dedupePeerDependents, що видаляє дублікати пакунків, що мають однакові залежності від інших проєктів у різних робочих просторах. dedupePeers спрощує сам формат суфіксів однорангових залежностей.
strictPeerDependencies#
- Стандартно: false
- Тип: Boolean
Якщо цей параметр увімкнено, команди не будуть виконуватися, якщо у дереві відсутня або невірна залежність від прямої залежності.
resolvePeersFromWorkspaceRoot#
- Стандартно: true
- Тип: Boolean
Якщо увімкнено, залежності кореневого проєкту робочої області використовуються для розвʼязання прямих залежностей будь-яких проєктів у робочій області. Це корисна функція, оскільки ви можете встановлювати прямі залежності лише у корені робочого простору, і ви можете бути впевнені, що всі проєкти у робочому просторі використовують однакові версії прямих залежностей.
peerDependencyRules#
peerDependencyRules.ignoreMissing#
pnpm не виводитиме попередження про відсутні у цьому списку прямі залежності.
Наприклад, у наступній конфігурації pnpm не виводитиме попередження, якщо залежність потребує react, але react не встановлено:
peerDependencyRules:
ignoreMissing:
- react
Також можна використовувати шаблони назв пакунків:
peerDependencyRules:
ignoreMissing:
- "@babel/*"
- "@eslint/*"
ignoreMissing matches the peer package name or a glob. It does not support
the parent>peer or parent@range>peer selectors accepted by
allowedVersions.
peerDependencyRules.allowedVersions#
Попередження про незадоволені залежності не буде виведено для залежностей із вказаного діапазону.
Наприклад, якщо у вас є залежності, які потребують react@16, але ви знаєте, що вони чудово працюють з react@17, то ви можете використовувати наступну конфігурацію:
peerDependencyRules:
allowedVersions:
react: "17"
Це скаже pnpm, що будь-яка залежність, яка має react у своїх прямих залежностях, повинна дозволити встановлення react v17.
Також можна вимкнути попередження лише для прямих залежностей певних пакунків. Наприклад, у наведеній нижче конфігурації react v17 буде дозволено лише тоді, коли він є в однорангових залежностях пакунка button v2 або в залежностях будь-якого пакунка card:
peerDependencyRules:
allowedVersions:
"button@2>react": "17"
"card>react": "17"
peerDependencyRules.allowAny#
allowAny — масив шаблонів назв пакунків, будь-яка пряма залежність, що відповідає шаблону, буде розвʼязана з будь-якої версії, незалежно від діапазону, вказаного у peerDependencies. Наприклад:
peerDependencyRules:
allowAny:
- "@babel/*"
- "eslint"
Наведений вище параметр вимкне попередження про невідповідність версій залежностей, повʼязаних з пакунками @babel/ або eslint.
allowAny matches the peer package name or a glob. It does not support
the parent>peer or parent@range>peer selectors accepted by
allowedVersions.