Der Moment, auf den der Kurs hinarbeitet: nix develop – und die Tools sind da.
git clone, ein nix develop – und
jede:r Mitwirkende hat exakt dieselben Tools in exakt denselben Versionen. Kein
„installier erst mal…" mehr. Heute baust du genau diese Shell.
mkShell macht
pkgs.mkShell ist eine Funktion (Lektion 3), die aus einem Set eine spezielle
Derivation erzeugt: keine, die ein Programm baut, sondern eine, die eine
Umgebung beschreibt. nix develop betritt sie und stellt alle genannten
Pakete in den PATH.
Wir nehmen das Flake aus Lektion 5 und schauen genau auf den devShells-Teil:
outputs = { self, nixpkgs }:
let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
in {
devShells.${system}.default = pkgs.mkShell {
packages = [
pkgs.git
pkgs.jq
pkgs.go
];
};
};
$ cd toolbox
$ nix develop
# jetzt sind git, jq und go verfügbar – exakt diese Versionen
$ go version
go version go1.22.x linux/amd64
$ which jq
/nix/store/…-jq-1.7.1/bin/jq # aus dem Store, nicht vom System
# wie bei nix shell: exit → alles wieder weg, System unverändert
$ exit
Vergleiche mit Lektion 1: Damals war es eine ad-hoc-Shell (nix shell nixpkgs#…).
Jetzt ist dieselbe Idee deklarativ in einer Datei festgehalten, versioniert und
teilbar. Das ist der ganze Unterschied zwischen „kurz ausprobieren" und „Projekt-Umgebung".
default und benannte Shells
nix develop ohne Argument nimmt devShells.<system>.default. Du kannst
weitere Shells benennen und gezielt betreten:
devShells.${system} = {
default = pkgs.mkShell { packages = [ pkgs.go ]; };
ci = pkgs.mkShell { packages = [ pkgs.go pkgs.golangci-lint ]; };
};
# Aufruf: nix develop .#ci
bash, nicht in deiner Shell
nix develop startet standardmäßig eine bash – nicht deine gewohnte
zsh/fish mit Prompt & Aliases. Für eine vertraute Shell nimm
nix develop -c $SHELL oder – viel komfortabler – direnv (Lektion 12).
mkShell baut man nicht mit nix build
Eine Dev-Shell ist zum Betreten da, nicht zum Bauen eines Ergebnisses.
nix build auf eine devShell ist selten sinnvoll – nutze nix develop.
packages ist der moderne Schlüssel
Du wirst in alten Beispielen buildInputs statt packages sehen. Für reine
Tool-Listen ist packages heute der empfohlene, klarere Weg. Den Unterschied
zu nativeBuildInputs klären wir in Lektion 7.
Nicht spicken – Abrufen aus dem Gedächtnis ist genau die Übung, die hängen bleibt.
Welchen Output sucht nix develop ohne Argument?
Ohne .#name nimmt nix develop die default-Dev-Shell für dein
System. packages.default wäre das Ziel von nix build.
Was ist der Kernunterschied zu nix shell nixpkgs#go?
Beide nutzen den Store und sind temporär. Der Unterschied: mkShell hält die Umgebung
versioniert und teilbar in flake.nix fest – reproduzierbar für das ganze Team.
Warum sieht dein Prompt nach nix develop „nackt" aus?
Standard ist eine schlichte bash ohne deine zsh/fish-Config.
nix develop -c $SHELL oder direnv (Lektion 12) bringt die gewohnte Shell zurück.
Ziel: Die toolbox-Shell betreten und beweisen, dass die Tools aus dem Store kommen.
packages-Liste deines Flakes um pkgs.go und pkgs.jq.git add nicht vergessen, dann nix develop.which go und which jq, dass beide unter /nix/store/ liegen.go draußen fehlt (oder eine andere Version ist).Tipp: Füge testweise eine zweite, benannte Shell .#ci hinzu und betritt sie gezielt.
$ git add flake.nix
$ nix develop
$ which go
/nix/store/…-go-1.22.x/bin/go
$ which jq
/nix/store/…-jq-1.7.1/bin/jq
$ exit
$ which go # weg oder System-Version – nicht der Store-Pfad
Genau dieser Store-Pfad ist die Garantie, dass alle im Team dieselben Versionen nutzen.
flake.nix und die Fehlermeldung – wir finden es zusammen.