Aus „funktioniert bei mir" wird „funktioniert überall" – die flake.lock.
flake.lock nagelt jeden Input auf einen exakten Commit –
und macht deine Dev-Shell echt reproduzierbar, heute wie in zwei Jahren.
flake.lock festhält
In Lektion 5 hast du nixpkgs.url = "…nixos-unstable" geschrieben – ein beweglicher
Zeiger. Beim ersten Flake-Befehl hat Nix automatisch eine flake.lock erzeugt, die diesen
Zeiger auf einen konkreten Commit-Hash auflöst:
# flake.lock (gekürzt) – JSON, von Nix verwaltet:
"nixpkgs": {
"locked": {
"type": "github",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "a1b2c3d…", # ← exakter Commit
"narHash": "sha256-…" # ← Inhalts-Prüfsumme
}
}
Solange diese Datei unverändert bleibt, bekommt jede:r exakt dasselbe Nixpkgs – also exakt dieselben Tool-Versionen in der Dev-Shell.
flake.lock gehört ins Git-Repo. Committe sie immer. Sie ist das, was
Reproduzierbarkeit von einem Versprechen zu einer Garantie macht – das Pendant zu
package-lock.json oder Cargo.lock.
$ nix flake lock # erzeugt/ergänzt die lock-Datei, ohne zu aktualisieren
$ nix flake update # aktualisiert ALLE Inputs auf den neuesten Stand
$ nix flake update nixpkgs # aktualisiert nur diesen einen Input
$ nix flake metadata # zeigt die aktuell gepinnten Revisionen
Wichtig: Ein Update ist eine bewusste Entscheidung, die die flake.lock
ändert. Danach läufst du auf neuen Versionen – also testen und den Lock-Diff committen, genau wie
ein Dependency-Update in jedem anderen Ökosystem.
Willst du bewusst auf einem stabilen Stand bleiben, zeig den Input auf einen Release-Branch
statt auf unstable:
inputs = {
# stabiler Release-Zweig statt rollendem unstable:
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
};
Der Branch in der url bestimmt die grobe Linie; die flake.lock pinnt
darin den exakten Commit. Beides zusammen gibt dir „stabil und exakt".
follows
Hat dein Flake mehrere Inputs, die ihrerseits Nixpkgs brauchen, willst du ein
gemeinsames Nixpkgs – sonst lädst du es doppelt. Das regelt follows:
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
flake-utils.url = "github:numtide/flake-utils";
some-tool = {
url = "github:foo/some-tool";
inputs.nixpkgs.follows = "nixpkgs"; # nutzt unser nixpkgs
};
};
nix develop tippt,
bekommt bit-genau deine Umgebung. Das ist das zentrale Versprechen von Nix – und ab hier hältst du es ein.
flake.lock nicht ignorieren
Sie versehentlich in .gitignore zu packen, zerstört die Reproduzierbarkeit lautlos –
plötzlich bekommt jede:r ein anderes Nixpkgs. Sie muss eingecheckt sein.
nix flake update ist kein No-Op
Es kann jedes Tool in deiner Shell auf eine neue Version heben. Führ es bewusst aus, prüf danach,
ob alles läuft, und committe den Lock-Diff als eigene Änderung – nicht beiläufig.
url
Die url ändern (z. B. von unstable auf 24.11) ist eine andere
Aktion als nix flake update. Erstere wechselt die Linie, Letztere holt den
neuesten Commit der bestehenden Linie.
Nicht spicken – Abrufen aus dem Gedächtnis ist genau die Übung, die hängen bleibt.
Was genau hält die flake.lock fest?
Die Lock-Datei pinnt jeden Input auf rev + narHash. Pakete und env vars
stehen in flake.nix, nicht im Lock.
Was tut nix flake update?
nix flake update aktualisiert die gepinnten Revisionen in der flake.lock
(alle Inputs, oder einen benannten). Eine bewusste, zu testende Änderung.
Was passiert, wenn die flake.lock nicht eingecheckt ist?
Ohne eingecheckte Lock-Datei löst der bewegliche Zeiger bei anderen zu einem anderen Commit auf – die Reproduzierbarkeit ist lautlos dahin. Genau das verhindert man durch Committen.
Ziel: Den gepinnten Stand sehen, ein Update bewusst durchführen und den Diff verstehen.
nix flake metadata – notiere die aktuelle nixpkgs-Revision.nix flake update aus und schau dir git diff flake.lock an.nix develop + go version, ob sich eine Version verändert hat.url auf nixos-24.11 und vergleiche das Verhalten.Tipp: Mach das Update in einem eigenen Commit – so kannst du es jederzeit zurückrollen.
$ nix flake metadata | grep -i nixpkgs
$ nix flake update
# warning: updating lock file …: 'nixpkgs' … → …
$ git diff flake.lock # nur rev + narHash ändern sich
$ git add flake.lock && git commit -m "chore: nixpkgs aktualisiert"
Genau dieser Workflow – Update, testen, Lock committen – ist Dependency-Management in Nix.
flake.lock sowie follows kompakt und korrekt.
follows.
stdenv.mkDerivation, Build-Phasen)