Aller au contenu principal
~$ guillaume.putier.fr

notes/pnpm-12-corepack

pnpm 12, corepack, et le .npmrc qui ne sert plus à rien

La CI casse sur un script de build ignoré alors que ton poste passe : corepack a installé une version majeure de plus, qui ne lit plus ton .npmrc.

  • pnpm
  • node
  • ci

Le pipeline tombe à l'install, avec ERR_PNPM_IGNORED_BUILDS et la ligne « Ignored build scripts: esbuild@0.28.2 ». Parfois c'est ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION à la place. Sur ton poste, le même pnpm install --frozen-lockfile passe sans broncher. Tu relances la CI deux fois pour voir. Toujours rouge.

Ton poste et la CI ne font pas tourner le même pnpm. Un package.json sans champ packageManager fait télécharger à corepack le dernier pnpm publié, quel qu'il soit : mesuré sur les runners le 4 septembre 2026, c'était 11.25.0, pendant que le poste tournait en pnpm 10 posé par Volta. Deux changements de la 11 mordent d'un coup. Un script de build ignoré devient une erreur et non plus un avertissement. Et minimumReleaseAge vaut 24 h par défaut, donc un lockfile fabriqué la veille sur le poste, qui cite un paquet publié depuis moins d'un jour, se fait refuser.

Deuxième couche, celle qui fait perdre le plus de temps : depuis la 11, .npmrc n'est plus lu pour les réglages pnpm. Une ligne allowed-builds=esbuild,sharp est du texte mort. Le réglage vivant s'appelle allowBuilds, il vit dans pnpm-workspace.yaml, et il prend un mapping booléen, pas une liste. Même sort pour le champ pnpm de package.json : overrides, patchedDependencies, onlyBuiltDependencies, tout est ignoré avec un simple WARN.

J'ai rejoué le cas sur pnpm 12 le 13 septembre 2026, en conteneur node:22-alpine, corepack prepare pnpm@latest résolvant 12.4.1. Trois installs --frozen-lockfile à neuf, sans cache partagé. Le mapping seul dans pnpm-workspace.yaml : le postinstall d'esbuild tourne, le build Astro passe. La clé dans .npmrc seule : ERR_PNPM_IGNORED_BUILDS. Les deux fichiers ensemble : ça passe, grâce au yaml, jamais grâce au .npmrc. La 12 garde donc les règles de la 11.

Le correctif : pin "packageManager" dans chaque package.json, migrer toute la config pnpm vers pnpm-workspace.yaml d'un coup, borner les overrides à borne ouverte, et supprimer les lignes mortes du .npmrc au lieu de les laisser rassurer le prochain lecteur. Si tu construis en Docker avec un install filtré, copie aussi pnpm-workspace.yaml dans le stage, sinon il perd toute la config.

Ce qu'il faut contrôler : la version de pnpm qui tourne côté CI, pas celle de ton terminal. Un pnpm --version en début de job, et un install rejoué dans un conteneur neuf sans cache avant de pousser.

retour aux notes