.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 Function | Processus | Uses |
---|---|---|
hooks.readPackage(pkg, context): pkg | Appelé après que pnpm ait analysé le manifeste du paquet de la dépendance | Permet de modifier le package.json d’une dépendance |
hooks.afterAllResolved(lockfile, context): lockfile | Appelé 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 depackage.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é danspnpm-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
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: Boolean
.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
- Default: 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.
:::Remarque
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.
:::