EMZETT.
Login

Lockfiles und reproduzierbare Builds: Gleiche Versionen überall

Kurz: Ein Lockfile hält die exakt installierten Versionen aller Pakete fest, damit Entwicklung, CI und Produktion denselben Stand nutzen und Builds reproduzierbar bleiben.

Genauer: In package.json steht "express": "^4.18.0", das heißt „4.18.0 oder neuer 4.x“. Ohne weitere Maßnahme installiert jeder Rechner je nach Zeitpunkt unterschiedliche Versionen: „Bei mir läuft es“ wird zum Problem. Das Lockfile löst das.

Im Detail

Was steht drin?

Ein Lockfile enthält alle direkten und transitiven Abhängigkeiten mit exakter Version und Prüfsumme (Hash) und Herkunft. Beispiele: package-lock.json (npm), pnpm-lock.yaml, yarn.lock, Cargo.lock (Rust), poetry.lock/uv.lock (Python), Gemfile.lock, composer.lock, go.sum. Es wird vom Werkzeug erzeugt, nicht von Hand bearbeitet.

Richtig nutzen

  • Lockfile ins Repository committen (bei Anwendungen; bei Bibliotheken je nach Konvention, sinnvoll für CI).
  • In der CI und im Deployment mit dem Lockfile installieren: npm ci (statt npm install), pip install -r requirements.txt --require-hashes, cargo build --locked. npm ci bricht ab, wenn Lockfile und package.json nicht passen.
  • Updates bewusst ausführen (npm update, Dependabot/Renovate), Änderungen im Lockfile im Pull Request prüfen.
  • Merge-Konflikte im Lockfile: nicht von Hand mischen; package.json auflösen und Lockfile neu erzeugen lassen.

Reproduzierbare Builds

Ziel: Gleiche Eingaben → gleiches Ergebnis (bitgenau). Dazu: Lockfiles, festgelegte Werkzeugversionen (.nvmrc, .tool-versions, engines), Container mit festen Basisabbildern (Digest statt latest), keine Zeitstempel im Build, deterministische Reihenfolge. Das erleichtert Fehlersuche, Rollbacks, Sicherheitsprüfungen (SBOM, Signaturen) und das Vertrauen, dass ein veröffentlichtes Artefakt zum Quellcode passt.

Sicherheit

Lockfiles mit Hashes schützen davor, dass ein Paket nachträglich ausgetauscht wird. Manipulierte Lockfiles in Pull Requests (andere Registry-URL) prüfen. Nutze private Registries/Proxys (Artifactory, Verdaccio) für Kontrolle. Dependency Confusion vermeidest du mit klaren Namensbereichen (Scopes) und Registry-Konfiguration.

Siehe auch: Semantic Versioning, Dependabot und Renovate, Abhängigkeiten und Bibliotheken, npm und Pakete