Passer au contenu principal
Version : Suivant

.pnpmfile.cjs

pnpm lets you hook directly into the installation process via special functions (hooks). Hooks can be declared in a file called .pnpmfile.cjs.

Par défaut, .pnpmfile.cjs doit être situé dans le même répertoire que le fichier de verrouillage. Par exemple, dans un workspace avec un fichier de verrouillage partagé, .pnpmfile.cjs doit être à la racine du monorepo.

Hooks

TL;DR

Hook FunctionProcessusUses
hooks.readPackage(pkg, context): pkgAppelé après que pnpm ait analysé le manifeste du paquet de la dépendancePermet de modifier le package.json d’une dépendance
hooks.afterAllResolved(lockfile, context): lockfileAppelé après que les dépendances aient été résolues.Permet de modifier le fichier lockfile

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

Permet de modifier le package.json d’une dépendance après l’analyse et avant la résolution. Ces mutations ne sont pas enregistrées dans le système de fichiers, cependant, elles affecteront ce qui est résolu dans le fichier lockfile et donc ce qui est installé.

Notez que vous devrez supprimer le pnpm-lock.yaml si vous avez déjà résolu la dépendance que vous souhaitez modifier.

astuce

Si vous avez besoin d'enregistrer les modificitions de package.json, vous devez utiliser la commande pnpm patch et patcher le fichier package.json. Cela peut être utile si vous souhaitez supprimer le champs bin d'une dépendance par exemple.

Arguments

  • pkg - Le manifeste du package. Soit la réponse du registre, soit le contenu de package.json.
  • context - Objet de contexte pour l'étape. La méthode #log(msg) permet d'utiliser un journal de débogage pour l'étape.

Utilisation

Exemple .pnpmfile.cjs (change les dépendances d'une dépendance) :

function readPackage(pkg, context) {
// Override the manifest of foo@1.x after downloading it from the registry
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
}

module.exports = {
hooks: {
readPackage
}
}

Limitations connues

Supprimer le champ scripts du manifeste d'une dépendance via readPackage n'empêchera pas de construire la dépendance. Lors de la construction d'une dépendance, pnpm lit le package.json du package à partir de l'archive du package, qui n'est pas affectée par le hook. Pour ignorer la construction d'un paquet, utilisez le champ pnpm.neverBuiltDependencies.

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

Vous permet de modifier la sortie du fichier de verrouillage avant qu’elle ne soit sérialisée.

Arguments

  • lockfile - Le fichier de résolution lockfile sérialisé dans pnpm-lock.yaml.
  • context - Objet de contexte pour l'étape. La méthode #log(msg) permet d'utiliser un journal de débogage pour l'étape.

Exemple d'utilisation

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

module.exports = {
hooks: {
afterAllResolved
}
}

Limitations connues

Il n'y en a pas - tout ce qui peut être fait avec le fichier de verrouillage peut être via cette fonction, et vous pouvez même étendre les fonctionnalités du fichier de verrouillage.

Configuration associée

ignore-pnpmfile

  • Par défaut: false
  • Type: Booléen

.pnpmfile.cjs sera ignoré. Utile avec --ignore-scripts lorsque vous voulez vous assurer qu'aucun script n'est exécuté pendant l'installation.

pnpmfile

  • Par défaut : .pnpmfile.cjs
  • Type: chemin
  • Exemple : .pnpm/.pnpmfile.cjs

L'emplacement du pnpmfile local.

global-pnpmfile

  • Par défaut : null
  • Type: chemin
  • Exemple : ~/.pnpm/global_pnpmfile.cjs

L'emplacement du pnpmfile global. Un fichier pnpm global est utilisé par tous les projets lors de l'installation.

note

Il est recommandé d'utiliser les fichiers pnpmfiles locaux. N'utilisez un pnpmfile global que si vous utilisez pnpm sur des projets qui n'utilisent pas pnpm comme gestionnaire de packages principal.