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(stattnpm install),pip install -r requirements.txt --require-hashes,cargo build --locked.npm cibricht ab, wenn Lockfile undpackage.jsonnicht 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.jsonauflö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