Startseite » Blog DE » package-lock.json vs. yarn.lock vs. pnpm-lock.yaml

package-lock.json vs. yarn.lock vs. pnpm-lock.yaml

Jeder, der länger mit Node.js arbeitet, hat sich bestimmt schon einmal gefragt: “Brauche ich diese package-lock.json wirklich?” Oder noch schlimmer: “Kann ich sie einfach löschen?” Falls du das jemals getan hast, möchte ich dir jetzt erklären, warum das vielleicht eine der schlechtesten Ideen war.

What is package-lock json

Was ist package-lock.json?

Kurz gesagt: Die package-lock.json ist eine Datei, die die exakte Version deiner Node.js-Abhängigkeiten festhält. Während package.json nur angibt, welche Pakete du brauchst (oft mit Versionsbereichen wie ^ oder ~), legt die package-lock.json genau fest, welche Version installiert wurde.

Warum ist das wichtig? Weil du damit sicherstellst, dass dein Code auf jeder Maschine exakt dieselben Abhängigkeiten benutzt. Ohne sie könnte ein npm install auf einem anderen Rechner eine andere Version eines Moduls installieren – und damit potenziell Bugs oder Inkompatibilitäten einführen.

Zusätzlich enthält package-lock.json Metadaten über jede Abhängigkeit, einschließlich Download-URLs, lockfileVersion und Integritätsprüfungen. Dies verhindert unerwartete Abweichungen und sorgt für Stabilität.

Datei
Zweck
package.json
Definiert die Abhängigkeiten eines Projekts mit Versionsbereichen (z. B. ^1.2.3)
package-lock.json
Speichert die exakten installierten Versionen, um konsistente Builds zu gewährleisten

Ein konkretes Beispiel: Angenommen, package.json enthält die Abhängigkeit "lodash": "^4.17.0". Ohne package-lock.json kann npm install auf unterschiedlichen Rechnern verschiedene Minor-Versionen von Lodash (z. B. 4.17.20oder 4.17.21) installieren, je nachdem, welche aktuell verfügbar ist. Die package-lock.json hingegen stellt sicher, dass immer genau die gleiche Version verwendet wird.

yarn lock

Was ist yarn.lock?

Die yarn.lock-Datei erfüllt denselben Zweck wie package-lock.json, allerdings für Yarn, einen alternativen Paketmanager zu npm. Sie stellt sicher, dass alle Entwickler und CI/CD-Pipelines dieselben Abhängigkeiten nutzen, indem sie exakte Paketversionen speichert.

pnpm lock

Was ist pnpm-lock.yaml?

PNPM ist ein weiterer alternativer Paketmanager, der Speicherplatz optimiert, indem er Abhängigkeiten nur einmal speichert und referenziert. pnpm-lock.yaml ist das Pendant zu package-lock.json und yarn.lock, aber optimiert für PNPMs einzigartige Speicherstrategie. Es stellt sicher, dass alle Pakete in einer deterministischen Weise installiert werden.

package-lock-yarn-lock-pnpm-lock

Unterschiede zwischen package-lock.json, yarn.lock und pnpm-lock.yaml

Feature
package-lock.json
yarn.lock
pnpm-lock.yaml
Paketmanager
npm
Yarn
PNPM
Geschwindigkeitsvorteile
Langsamer bei Installationen
Schneller durch bessere Caching-Mechanismen
Sehr schnell durch Symlink-Nutzung
Dateiformat
JSON
Spezielles Textformat
YAML
Determinismus
Stabil, aber gelegentliche Inkonsistenzen
Besserer Determinismus in der Auflösung
Sehr deterministisch
Speicheroptimierung
Keine
Mittelmäßig
Hoch (Shared Store)
Integritätsprüfungen
Enthält integrity-Werte und lockfileVersion
Enthält ebenfalls integrity, aber optimiert für Yarn
Nutzt dedizierte Checksum-Funktionen

Falls du also Yarn benutzt, solltest du immer yarn.lock committen, während package-lock.json für npm-Projekte wichtig ist. Nutzt du PNPM, solltest du pnpm-lock.yaml verwenden.

Sollte ich meine Lock-Datei committen?

Ja! Lock-Dateien sollten immer mit ins Git-Repository aufgenommen werden. Ohne sie können verschiedene Teammitglieder oder Build-Server leicht unterschiedliche Versionen von Abhängigkeiten installieren, was zu schwer nachvollziehbaren Bugs führt. Indem du die Datei committest, stellst du sicher, dass alle exakt die gleichen Abhängigkeiten nutzen.

Warum ist das wichtig?

  • Konsistente Builds: Jeder Entwickler und jede CI/CD-Pipeline installiert exakt dieselben Versionen.
  • Vermeidung von Dependency Drift: Unerwartete Updates durch flexible Versionsbereiche in package.jsonwerden verhindert.
  • Nachvollziehbarkeit: Falls Bugs auftreten, kannst du genau sehen, welche Version der Abhängigkeiten verwendet wurde.

Sollte ich meine Lock-Datei löschen?

Nein! Das Löschen einer Lock-Datei kann zu inkonsistenten Builds und unerwarteten Fehlern führen. Falls du Probleme mit der Datei hast, solltest du lieber versuchen, sie zu aktualisieren (npm install, yarn install, pnpm install oder npm update) oder npm ci, yarn install --frozen-lockfile bzw. pnpm install --frozen-lockfile verwenden, um eine saubere Neuinstallation durchzuführen.

Falls du wirklich Probleme mit veralteten oder inkonsistenten Abhängigkeiten hast, kannst du Folgendes tun:

  1. Lock-Datei löschen: rm package-lock.json oder rm yarn.lock oder rm pnpm-lock.yaml
  2. Node-Module-Verzeichnis löschen: rm -rf node_modules
  3. Neu installieren: npm install, yarn install oder pnpm install

Aber Achtung: Dies sollte nur gemacht werden, wenn du mit möglichen Versionsänderungen klarkommst.

package lock json security

Welche Auswirkungen hat eine Lock-Datei auf die Sicherheit?

  • Integritätsprüfungen: Jede Abhängigkeit in package-lock.json, yarn.lock und pnpm-lock.yaml enthält eine integrity-Checksumme. Dies stellt sicher, dass der Paketmanager erkennt, wenn Pakete manipuliert wurden.
  • Verhinderung von Dependency Drift: Ohne Lock-Datei könnten neue (potenziell unsichere) Versionen von Abhängigkeiten unbemerkt in dein Projekt rutschen.

Worst-Case-Szenario: Supply-Chain-Angriffe

Wenn ein Angreifer es schafft, eine bösartige Version eines Pakets in ein öffentliches Repository einzuschleusen, könnten Nutzer ohne eine Lock-Datei automatisch auf diese Version aktualisieren. Dies kann zu schwerwiegenden Sicherheitsproblemen führen, z. B.:

  • Code-Injection: Der Angreifer fügt schädlichen Code in das kompromittierte Paket ein, das dann in deine Anwendung gelangt.
  • Credential Theft: Das manipulierte Paket kann versuchen, Umgebungsvariablen wie API-Schlüssel oder Datenbank-Passwörter auszulesen.
  • Backdoors: Ein Angreifer könnte persistente Hintertüren in dein System einbauen.

Wie kann man sich schützen?

  • package-lock.json immer committen: So verhinderst du, dass npm automatisch eine kompromittierte Version installiert.
  • Regelmäßig npm audit ausführen: Damit kannst du bekannte Sicherheitsprobleme in deinen Abhängigkeiten identifizieren.
  • Verwendung von npm ci in Produktionsumgebungen: Dies stellt sicher, dass keine unerwarteten Änderungen an Abhängigkeiten auftreten.
  • Dependabot oder Renovate nutzen: Diese Tools helfen dir, Updates sicher und kontrolliert durchzuführen.
Red Teaming

Praktische Anwendungsfälle

Fall 1: Der "Warum läuft es bei mir, aber nicht bei dir?"-Fehler

Dein Kollege zieht dein neuestes Update, führt npm install aus und dein Projekt stürzt sofort ab. Aber auf deinem Rechner läuft es einwandfrei. Wo liegt das Problem?

Mögliche Ursache: Ohne package-lock.json hat dein Kollege möglicherweise eine leicht andere Version eines Abhängigkeitspakets erhalten. Vielleicht hat sich ein Bug in ein Minor-Update eingeschlichen.

Lösung:

  • Stelle sicher, dass package-lock.json ins Git-Repository aufgenommen wird.
  • Dein Kollege sollte npm ci statt npm install verwenden (dazu gleich mehr).

Fall 2: CI/CD Pipelines, die stabil laufen

In Continuous Integration (CI)-Pipelines willst du sicherstellen, dass jeder Build exakt gleich ist. Hier kommt npm ci ins Spiel.

Warum npm ci statt npm install?

  • npm ci ignoriert package.json und installiert exakt die in package-lock.json definierten Versionen.
  • Es löscht das node_modules-Verzeichnis vor der Installation, um eine wirklich saubere Umgebung zu gewährleisten.
  • Es ist schneller, weil es direkt aus der Lock-Datei arbeitet.

Verwende also immer npm ci in CI/CD-Systemen oder wenn du auf absolut reproduzierbare Builds angewiesen bist.

Fazit

Lock-Dateien sind nicht einfach nur “nervige” Dateien, die sich ständig ändern. Sie sind entscheidende Bestandteile einer stabilen, sicheren und reproduzierbaren Node.js-Umgebung. Wenn du in einem Team arbeitest oder CI/CD einsetzt, solltest du sie niemals ignorieren.

Falls du noch Fragen oder eigene Erfahrungen hast, lass es mich wissen! Happy Coding! 🚀

Nach oben scrollen
WordPress Cookie Plugin von Real Cookie Banner