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

.pnpmfile.mjs

pnpm дозволяє вам підключатися безпосередньо до процесу встановлення за допомогою спеціальних функцій (хуків). Hooks can be declared in a file called .pnpmfile.mjs (ESM) or .pnpmfile.cjs (CommonJS).

By default, .pnpmfile.mjs should be located in the same directory as the lockfile. For instance, in a workspace with a shared lockfile, .pnpmfile.mjs should be in the root of the monorepo.

Хуки

TL;DR

Функція хукаПроцесВикористання
hooks.readPackage(pkg, context): pkgВикликається після того, як pnpm проаналізує маніфест пакунків залежностіДозволяє змінювати файл package.json залежності
hooks.afterAllResolved(lockfile, context): lockfileВикликається після розвʼязання залежностей.Дозволяє змінювати файл блокування.
hooks.beforePacking(pkg): pkgВикликається перед створенням tar-архіву під час пакування/публікаціїДозволяє налаштувати опублікований package.json

hooks.readPackage(pkg, context): pkg | Promise<pkg>

Дозволяє змінювати package.json залежності після аналізу і до розвʼязання. Ці мутації не зберігаються у файловій системі, проте вони впливають на те, що буде отримано у файлі блокування, а отже, і на те, що буде встановлено.

Зауважте, що вам потрібно буде видалити pnpm-lock.yaml, якщо ви вже розвʼязали залежність, яку ви хочете змінити.

підказка

Якщо вам потрібно внести зміни до package.json, збереженого у файловій системі, вам потрібно скористатися командою pnpm patch і виправити файл package.json. Це може бути корисно, наприклад, якщо ви хочете видалити поле bin у залежності.

Аргументи

  • pkg – маніфест пакунка. Або відповідь з реєстру, або вміст package.json.
  • context — обʼєкт Context для кроку. Метод #log(msg) дозволяє використовувати журнал налагодження для кроку.

Використання

Example .pnpmfile.mjs (changes the dependencies of a dependency):

function readPackage(pkg, context) {
// Перевизначимо маніфест foo@1.x, завантаживши його з реєстру
if (pkg.name === 'foo' && pkg.version.startsWith('1.')) {
// Replace bar@x.x.x with bar@2.0.0
pkg.dependencies = {
...pkg.dependencies,
bar: '^2.0.0'
}
context.log('bar@1 => bar@2 in dependencies of foo')
}

// This will change any packages using baz@x.x.x to use baz@1.2.3
if (pkg.dependencies.baz) {
pkg.dependencies.baz = '1.2.3';
}

return pkg
}

export const hooks = {
readPackage
}

Відомі обмеження

Видалення поля scripts з маніфесту залежності за допомогою readPackage не завадить pnpm зібрати залежність. При побудові залежності pnpm зчитує package.json пакунка з архіву пакунка, на який хук не впливає. In order to ignore a package's build, use the allowBuilds field.

hooks.updateConfig(config): config | Promise<config>

Додано у: v10.8.0

Дозволяє змінювати параметри конфігурації, які використовуються pnpm. Цей хук є найбільш корисним у поєднанні з configDependencies, що дозволяє вам ділитися та повторно використовувати налаштування в різних репозиторіях Git.

Наприклад, @pnpm/plugin-better-defaults використовує хук updateConfig для застосування спеціального набору рекомендованих параметрів.

Приклад використання

.pnpmfile.mjs
export const hooks = {
updateConfig (config) {
return Object.assign(config, {
enablePrePostScripts: false,
optimisticRepeatInstall: true,
resolutionMode: 'lowest-direct',
verifyDepsBeforeRun: 'install',
})
}
}

hooks.afterAllResolved(lockfile, context): lockfile | Promise<lockfile>

Дозволяє змінювати вивід файлу блокування перед його серіалізацією.

Аргументи

  • lockfile — Обʼєкт резолюції файлу блокування, який серіалізовано у pnpm-lock.yaml.
  • context — обʼєкт Context для кроку. Метод #log(msg) дозволяє використовувати журнал налагодження для кроку.

Приклад використання

.pnpmfile.mjs
function afterAllResolved(lockfile, context) {
// ...
return lockfile
}

export const hooks = {
afterAllResolved
}

Відомі обмеження

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

hooks.beforePacking(pkg): pkg | Promise<pkg>

Додано у: v10.28.0

Дозволяє змінити маніфест package.json перед його пакуванням у tar-архів під час pnpm pack або pnpm publish. Це корисно для налаштування опублікованого пакунка без впливу на вашу локальну розробку package.json.

На відміну від hooks.readPackage, який змінює спосіб розвʼязання залежностей під час встановлення, beforePacking впливає лише на вміст архіву, який публікується.

Аргументи

  • pkg – Об’єкт маніфесту пакунка, який буде включено до опублікованого tar-архіву.

Приклад використання

.pnpmfile.mjs
function beforePacking(pkg) {
// Remove development-only fields from published package
delete pkg.devDependencies
delete pkg.scripts.test

// Add publication metadata
pkg.publishedAt = new Date().toISOString()

// Modify package exports for production
if (pkg.name === 'my-package') {
pkg.main = './dist/index.js'
}

return pkg
}

export const hooks = {
beforePacking
}
нотатка

Зміни, зроблені цим хуком, впливають тільки на package.json всередині архіву. Ваш локальний файл package.json залишається незмінним.

hooks.preResolution(options): Promise<void>

Цей хук буде виконаний після читання та аналізу файлів блокування проєкту, але перед розвʼязанням залежностей. Це дозволяє змінювати обʼєкти файлу блокування.

Аргументи

  • options.existsCurrentLockfile — булеве значення, яке є істинним, якщо файл блокування за адресою node_modules/.pnpm/lock.yaml існує.
  • options.currentLockfile — Обʼєкт файлу блокування з node_modules/.pnpm/lock.yaml.
  • options.existsNonEmptyWantedLockfile — булеве значення, яке є істинним, якщо файл блокування за адресою pnpm-lock.yaml існує.
  • options.wantedLockfile — Обʼєкт файлу блокування з pnpm-lock.yaml.
  • options.lockfileDir — Тека, де знаходиться потрібний файл блокування.
  • options.storeDir — Розташування теки store.
  • options.registries — Зіставлення областей видимості з URL-адресами реєстрів.

hooks.importPackage(destinationDir, options): Promise<string | undefined>

Цей хук дозволяє змінити спосіб запису пакунків до node_modules. Значення, що повертається, є необовʼязковим і вказує, який метод було використано для імпорту залежності, наприклад: clone, hardlink.

Аргументи

  • destinationDir — Тека призначення, куди має бути записано пакунок.
  • options.disableRelinkLocalDirDeps
  • options.filesMap
  • options.force
  • options.resolvedFrom
  • options.keepModulesDir

Пошук

Додано у: v10.16.0

Функції пошуку використовуються з pnpm list та pnpm why через прапорець --find-by.

Приклад:

.pnpmfile.mjs
export const finders = {
react17: (ctx) => {
return ctx.readManifest().peerDependencies?.react === "^17.0.0"
}
}

Використання:

pnpm why --find-by=react17

Дивіться Пошук для отримання додаткової інформації.

Повʼязана конфігурація

ignorePnpmfile

  • Стандартно: false
  • Тип: Boolean

The pnpmfile will be ignored. Корисно використовувати разом з --ignore-scripts, якщо ви хочете переконатися, що жоден скрипт не буде виконано під час встановлення.

pnpmfile

  • Default: ['.pnpmfile.mjs']
  • Тип: path[]
  • Example: ['.pnpm/.pnpmfile.mjs']

Розташування локальних файлів pnpmfile.

globalPnpmfile

  • Стандартно: null
  • Тип: path
  • Example: ~/.pnpm/global_pnpmfile.mjs

Розташування глобального pnpmfile. Глобальний pnpmfile використовується всіма проєктами під час встановлення.

нотатка

Рекомендується використовувати локальні pnpmfiles. Використовуйте глобальний файл pnpmfile лише у тому випадку, якщо ви використовуєте pnpm у проєктах, які не використовують pnpm як основний менеджер пакунків.