pnpm 11.8 liefert `install --dry-run`, Node.js Package Maps und eine SBOM pro Paket

pnpm 11.8 liefert `install --dry-run`, Node.js Package Maps und eine SBOM pro Paket

lschvn

pnpm 11.8.0 erschien am 18. Juni 2026, drei Tage nach 11.7.0, dem Release, das --frozen-store, die Auflösungsdelegation an pacquet und einen Path-Traversal-Fix im Lockfile hinzufügte. Wo 11.7 sich um reproduzierbare und schreibgeschützte Installationen drehte, zielt 11.8 auf Observability und Supply-Chain-Reporting ab: ein Dry-Run-Modus, der npm endlich entspricht, ein Node.js-Package-Map-Format, das die Auflösungsexperimente des Runtimes speist, und zwei CycloneDX-SBOM-Verbesserungen, die pnpm sbom für echte Compliance-Workflows brauchbar machen. Dazu kommt ein zweiter Path-Traversal-Advisory, diesmal in configDependencies, und ein macOS-Gatekeeper-Fix, der Nutzer nativer Module schon länger nervte.

pnpm install --dry-run: die Funktion, die npm hatte und pnpm nicht

Der wichtigste Neuzugang ist --dry-run für pnpm install. Es führt eine vollständige Abhängigkeitsauflösung gegen die aktuellen Manifeste durch und gibt aus, was eine Installation hinzufügen, entfernen oder ändern würde, schreibt dann aber nichts: kein pnpm-lock.yaml, kein node_modules, keine Store-Mutation. Es beendet sich immer mit Code 0, was der Semantik von npm install --dry-run entspricht und Issue #7340 schließt, das seit 2022 offen war.

Der praktische Anwendungsfall ist CI und Code-Review: ein PR, der eine Abhängigkeit anhebt oder einen Katalog-Eintrag wechselt, kann pnpm install --dry-run ausführen, um den vollständigen transitiven Diff offenzulegen, einschließlich Peer-Warnungen und Build-Script-Freigaben, ohne das Arbeitsverzeichnis anzutasten. Da pnpm die Auflösung ohnehin schnell durchführt, kostet es einen Auflösungsdurchlauf ohne Dateisystem-Schreibzugriff. Der Exit-Code ist bewusst immer 0, damit das Flag innerhalb eines bestehenden Installationsschritts liegen kann, ohne eine Pipeline bei einem harmlosen Diff auf Rot zu schalten.

Node.js-Package-Maps unter node_modules/.package-map.json

11.8 kann nun eine node_modules/.package-map.json während isolierter (Standard) und gehobener Installationen erzeugen. Zwei Einstellungen steuern das Verhalten:

  • node-experimental-package-map: Wenn aktiviert, injiziert pnpm die erzeugte Map in die Node.js-Skriptumgebungen, die es verwaltet, sodass der Runtime eine vorberechnete Paket-Layout-Beschreibung konsultieren kann, statt node_modules beim Start zu durchlaufen.
  • node-package-map-type: wählt zwischen einer standard- und einer loose-Map und tauscht dabei Strenge gegen Kompatibilität ein.

Das ist frühe Infrastruktur für die Package-Auflösungsreform von Node, bei der eine deklarative Map-Datei die implizite, dateisystemgetriebene Auflösung ersetzen könnte, die jeder Paketmanager derzeit umgehen muss. Dass pnpm die Map erzeugt, bedeutet, dass Projekte, die sie aktivieren, eine konsistente Layout-Beschreibung erhalten, unabhängig davon, ob sie den isolierten oder den gehobenen Linker verwenden. Der Name der Einstellung (node-experimental-package-map) signalisiert, dass das Format noch nicht stabil ist.

SBOM: devDependencies-Scope und Erzeugung pro Paket

Die beiden SBOM-Änderungen in 11.8 zielen auf die Lücke zwischen einem Abhängigkeitsbaum und dem, was ein CycloneDX-Konsument tatsächlich erschließen kann.

Erstens markiert pnpm sbom nun Komponenten, die nur über devDependencies erreichbar sind, mit dem CycloneDX-Scope scope: "excluded" und der Eigenschaft cdx:npm:package:development. Der Scope excluded ist die CycloneDX-Art, „Komponentennutzung für Test- und andere Non-Runtime-Zwecke“ zu dokumentieren, was genau einer devDependency entspricht. Die Eigenschaft spiegelt den Marker, den @cyclonedx/cyclonedx-npm ausgibt, sodass sowohl moderne (scope-basierte) als auch bestehende (eigenschaftsbasierte) Konsumenten ihn erfassen. Komponenten, die zur Laufzeit erreichbar sind, einschließlich installierter optionalDependencies, lassen den scope weg und standardisieren auf required.

Zweitens kommt die SBOM-Erzeugung pro Paket über zwei Flags:

  • --out out/%s.cdx.json schreibt ein CycloneDX-Dokument pro Workspace-Paket in einzelne Dateien.
  • --split gibt NDJSON auf stdout aus, ein Paket pro Zeile.

Wenn --filter ein einzelnes Paket auswählt, verwendet die SBOM-Wurzelkomponente nun die Metadaten dieses Pakets. Workspace-Interabhängigkeiten, die über das workspace:-Protokoll deklariert sind, sowie deren transitive Abhängigkeiten werden einbezogen, sodass eine pro-Paket-SBOM in sich geschlossen ist. Autor, Repository und Lizenz fallen auf das Wurzel-Manifest zurück, wenn das Paket sie nicht definiert. Für ein Monorepo, das pro veröffentlichter Bibliothek eine SBOM ausliefern muss, ist das der Unterschied zwischen dem Nachbearbeiten eines riesigen Dokuments und dem Erhalt pro-Paket-Artefakte direkt vom Installationstool.

Path-Traversal bei configDependencies (GHSA-qrv3-253h-g69c)

11.8 schließt einen zweiten Path-Traversal-Advisory, unterschieden vom Lockfile-Alias-Fix in 11.7 und der esbuild-0.28.1-Windows-Traversal, die in einem anderen Werkzeug aufgetaucht war. Vor 11.8 konnte ein committetes Lockfile, dessen configDependencies einen traversal-förmigen Namen (etwa ../../PWNED) oder eine Version (etwa ../../../PWNED) enthielten, bewirken, dass pnpm install Symlinks oder Paketdateien außerhalb von node_modules/.pnpm-config und dem Store anlegt.

Der Fix validiert die Namen und Versionen der configDependencies, bevor sie für Pfadkonstruktionen verwendet werden. Namen müssen nun gültige npm-Paketnamen und Versionen exakte Semver-Strings sein. Dieselbe Validierung läuft auf optionale Subabhängigkeiten von configDependencies und auf das Legacy-Workspace-Manifest-Format, bevor ein Lockfile geschrieben wird. Wie das Lockfile-Gate in 11.7 ist das Defense in Depth: ein Projekt, das seiner Lockfile-Quelle bereits vertraut, profitiert dennoch, weil die Prüfung vor teilweiser Korruption und vor Bugs im Lockfile-Generator selbst schützt. Siehe GHSA-qrv3-253h-g69c.

macOS Gatekeeper blockiert native Binaries nicht mehr

Ein leiserer, aber weit verbreitet spürbarer Fix: Wenn pnpm Dateien aus seinem inhaltsadressierbaren Store nach node_modules importiert, bewahrt macOS erweiterte Attribute, darunter com.apple.quarantine. War dieses xattr auf einem Store-Blob vorhanden (es wurde beispielsweise zuerst unter einer Gatekeeper-aktivierten App wie einem Git-Client geschrieben), propagierte es nach node_modules, und Gatekeeper blockierte das Laden des nativen Binaries, obwohl pnpm die Dateiintegrität bereits gegen das Lockfile geprüft hatte.

Nach dem Import eines Pakets entfernt 11.8 nun com.apple.quarantine von nativen Binaries (.node, .dylib, .so), entsprechend dem Verhalten von Homebrew, das Quarantäne von geprüften Downloads entfernt. Die Bereinigung ist nur für macOS, läuft in einem gebündelten xattr-Aufruf pro Paket, ist auf native Binaries beschränkt, sodass andere Dateien unangetastet bleiben, und ist nicht fatal. Er behebt #11056.

Weitere erwähnenswerte Fixes

pnpm run --no-bail beendet sich nun mit einem von Null verschiedenen Code, wenn ein ausgeführtes Skript fehlschlägt, während es dennoch alle passenden Skripte bis zum Ende ausführt. Das schließt Issue #8013: nicht-rekursive --no-bail-Läufe beendeten sich bisher immer mit 0 selbst bei Fehlschlag, was inkonsistent mit rekursiven Läufen war, die bereits am Ende fehlschlugen.

pnpm view ohne Paketnamen sucht nun aufwärts nach dem nächsten Projekt-Manifest (package.json, package.yaml oder package.json5) und verwendet dessen name-Feld und ersetzt die find-up-Abhängigkeit durch das schnellere Modul empathic. Mehrere Lockfile-Korrektheits-Bugs kommen ebenfalls dazu: inkrementelle Installationen behalten keine duplizierten transitiven Abhängigkeiten mehr, die eine frische Installation nicht erzeugt hätte (#5108), optimisticRepeatInstall meldet nicht mehr „Already up to date“, wenn nur das Lockfile geändert wurde (#12100), und Katalog-Overrides, die über einen Katalog aufgelöst werden, bleiben während pnpm update mit dem Katalog synchron. pnpm version --recursive respektiert nun den Workspace-Filter statt jedes Paket anzuheben (#11348). Die Reporter-Ausgabe für pnpm store und pnpm config geht nun auf stderr, sodass Skripte wie PNPM_STORE=$(pnpm store path) keine Warnungen mehr im Ergebnis erfassen.

Upgrade

pnpm 11.8.0 benötigt Node.js 22.13 oder neuer, dieselbe Basis wie 11.7. Das Lockfile-Format ist unverändert, sodass ein npm install -g pnpm@latest (oder corepack prepare pnpm@latest --activate) gefolgt von einem pnpm install den vollständigen Upgrade-Pfad darstellt. Die neuen Flags sind alle opt-in, und die configDependencies-Validierung lehnt nur Eingaben ab, die nie gültige Paketnamen waren.

Häufig gestellte Fragen

Verwandte Artikel

Weitere Berichterstattung zu ähnlichen Themen und Tags.

Claude Code Bug #74066: Nutzer Melden Cross-Workspace-Kontext-Leaks auf Sonnet 5, Anthropic Hat Noch Nicht Antwortet
security

Claude Code Bug #74066: Nutzer Melden Cross-Workspace-Kontext-Leaks auf Sonnet 5, Anthropic Hat Noch Nicht Antwortet

Ein offener Bug, der am 2026-07-04 gegen Claude Code von einem [Enterprise-ZDR](https://docs.anthropic.com/en/docs/build-with-claude/zero-data-retention)-Nutzer eingereicht wurde, beschreibt eine Arbeitssitzung auf Sonnet 5, die plötzlich auf einen unrelated Minecraft-Tempelbau referenziert und dann im Recap bei der falschen Aufgabe bleibt. Der Reporter (GitHub: [@milesrichardson-edb](https://github.com/milesrichardson-edb), Issue [anthropics/claude-code#74066](https://github.com/anthropics/claude-code/issues/74066)) ist auf Enterprise Zero Data Retention, dem Tier, das Anthropic speziell als sitzungsisoliert vermarktet. Ein Triage auf der lokalen Sitzungs-JSONL des Reporters unter `~/.claude/projects/<encoded-cwd>/<session-id>.jsonl` zeigt, dass der geleakte Text nicht im Transkript enthalten ist, was einen lokalen Kontext-Leak durch Datei-Überlappung ausschließt. Vier andere Nutzer in den Kommentaren (mit Arbeitsgeschichten, die bis ins letzte Jahr zurückreichen) beschreiben nahezu identisches Verhalten über Claude Code, Claude Mobile und Claude Deep Research hinweg. Der plausibelste architektonische Fit ist geteilter KV-Cache-Zustand in der Inferenz ([laut @yv3nne in den Kommentaren](https://github.com/anthropics/claude-code/issues/74066#issuecomment-4880448776)), aber kein Anthropic-Ingenieur hat die Issue in den 22 Stunden seit der Einreichung kommentiert, und die Issue erreichte am 2026-07-04 die Spitze von [Hacker News](https://news.ycombinator.com/item?id=42481789). Der Ton im Thread ist gespalten: Die Hälfte vermutet echte Plattform-Cache-Wiederverwendung, die andere Hälfte vermutet eine [sonnet-5-spezifische Halluzination, ausgelöst durch einen Pygments-Lexer](https://github.com/anthropics/claude-code/issues/74066#issuecomment-4880334711). Beide Lesarten sind glaubwürdig.
Turborepo 2.10.3 Erkennt nub und aube, Zwei Neue Rust-basierte Node.js-Paketmanager von Colin McDonnell (Zod) und Jeff Dickey (mise)
tooling

Turborepo 2.10.3 Erkennt nub und aube, Zwei Neue Rust-basierte Node.js-Paketmanager von Colin McDonnell (Zod) und Jeff Dickey (mise)

Turborepo [v2.10.3](https://github.com/vercel/turborepo/releases/tag/v2.10.3) wurde am 2026-07-03 mit First-Class-Support für [nub](https://github.com/nubjs/nub) und [aube](https://github.com/jdx/aube) veröffentlicht, zwei Rust-basierten Node.js-Paketmanagern, die im Frühjahr und Sommer 2026 entstanden sind. nub stammt von Colin McDonnell (Schöpfer von [Zod](https://github.com/colinhacks/zod), 43k Sternen) und aube von Jeff Dickey (Schöpfer von [mise](https://github.com/jdx/mise)); beide integrieren sich in Turborepo als `packageManager`-Werte in `package.json` und `devEngines.packageManager`. Die Release liefert außerdem einen neuen TUI/Streamed-Logs-Toggle, Click-to-Select für Tasks in der TUI-Taskliste, automatisches Kopieren von TUI-Selektionen in die Zwischenablage bei Maus-Release, ein `--production`-Flag auf `turbo prune`, TypeScript 7.0.1-rc als Workspace-Toolchain, Thin LTO + `codegen-units=1` für Release-Builds und eine lange Liste von Cache-Hashing-Performance-Fixes. Das Hauptsignal: Zwei der angesehensten Builder des JS-Toolchains liefern nun Paketmanager, die auf Stock-Node aufsetzen statt es zu ersetzen, und Turborepo ist das erste Mainstream-Monorepo-Tool, das beide formalisiert.
npm 11.18 befördert die `linked`-Installationsstrategie zu stabil, führt den `npm install-scripts`-Namensraum ein und warnt, wenn `min-release-age` einen Audit-Fix blockiert
tooling

npm 11.18 befördert die `linked`-Installationsstrategie zu stabil, führt den `npm install-scripts`-Namensraum ein und warnt, wenn `min-release-age` einen Audit-Fix blockiert

npm 11.18.0 (29. Juni 2026) liefert drei Features und einen langen Bugfix-Backlog, die zusammen die Arbeit am `install-strategy=linked`-(isolated)-Installationsmodus abschließen, die das npm-CLI seit RFC #0042 aus dem Jahr 2022 verfolgt. Die Schlagzeile ist [PR #9677](https://github.com/npm/cli/pull/9677) (Backport von #9674), die `--install-strategy=linked` von experimentell auf stabil hebt. Der Modus installiert jedes Paket in `node_modules/.store/<name>@<version>/node_modules/<dep>` und verlinkt dessen deklarierte Abhängigkeiten in den eigenen `node_modules/<dep>`-Baum, sodass ein Paket nur Abhängigkeiten `require`n kann, die tatsächlich in seinem eigenen `package.json` stehen. Die neue Doku-Empfehlung ([PR #9690](https://github.com/npm/cli/pull/9690)) lautet, `--install-strategy=linked` in CI auszuführen, um Phantom-Abhängigkeiten vor dem Veröffentlichen abzufangen. Um die Beförderung herum liefert die Release den neuen `npm install-scripts`-Namensraum ([#9635](https://github.com/npm/cli/pull/9635), Backport von #9629) mit `approve`, `deny` und `ls`, wobei `npm approve-scripts` / `npm deny-scripts` als Alias erhalten bleiben; einen `install-scripts: prune unused allowScripts entries`-Aufräumdurchlauf ([#9662](https://github.com/npm/cli/pull/9662)); und eine neue Warnung, wenn `min-release-age` einen `npm audit fix` blockiert ([#9564](https://github.com/npm/cli/pull/9564)). Die 43-Commit-Release fixt zudem 19 Bugs der `linked`-Strategie (Audit-Determinismus #9638, verwaiste `.bin`-Shims #9643, Aufräumen veralteter `.store`-Verzeichnisse #9649, ungültiger `filterNode`-Crash #9645, peerOptional-Validierung #9641), drei `npm sbom`-Fixes und einen Prozent-Encoding-Fix für den `vcs_url`-Qualifier in generierten Purls ([#9693](https://github.com/npm/cli/pull/9693)).

Kommentare

Anmelden Melden Sie sich an, um an der Diskussion teilzunehmen.

Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.