Die vier Schlüssel, die du wirklich brauchst: packages, nativeBuildInputs, shellHook, env vars.
mkShell| Schlüssel | Wofür |
|---|---|
packages |
Tools, die du benutzt (go, jq, git). Der Normalfall. |
nativeBuildInputs |
Build-Werkzeuge, die auf der Bau-Maschine laufen (Compiler, pkg-config). |
buildInputs |
Libraries, gegen die das Ziel linkt (openssl, zlib). |
inputsFrom |
„Übernimm die Build-Inputs dieser Pakete" – ideal, um die Shell eines eigenen Pakets zu spiegeln. |
shellHook |
Shell-Befehle, die beim Betreten laufen. |
packages
fast immer richtig. nativeBuildInputs/buildInputs werden wichtig, sobald du
kompilierst – also ab den Paket-Lektionen 9–11.
Das ist der elegante Trick von mkShell: jedes Attribut, das kein reservierter
Schlüssel ist und sich zu einem String machen lässt, landet als Umgebungsvariable in der Shell.
devShells.${system}.default = pkgs.mkShell {
packages = [ pkgs.go pkgs.jq ];
# diese beiden werden zu echten env vars:
GOFLAGS = "-mod=vendor";
PROJECT = "toolbox";
shellHook = ''
echo "→ toolbox dev-shell ($PROJECT) bereit"
export PATH="$PWD/bin:$PATH"
'';
};
In der Shell sind dann $GOFLAGS und $PROJECT gesetzt, und der
shellHook begrüßt dich und erweitert den PATH. Der mehrzeilige
''…''-String ist genau der aus Lektion 2.
shellHook: das Einrichtungs-SkriptTypische Aufgaben beim Betreten der Shell:
make dev").mkdir -p .cache).packages ≠ nativeBuildInputs – aber nah dran
Für eine reine Tool-Shell verhalten sie sich fast gleich (beide kommen in den PATH).
Der Unterschied zählt erst beim Bauen (Cross-Compiling: Host- vs. Ziel-Plattform). Verlier
dich jetzt nicht darin – nimm packages, bis du wirklich kompilierst.
packages, shellHook, name & Co. sind Schlüssel von
mkShell selbst – die tauchen nicht als Variablen auf. Willst du eine Variable
name, brauchst du einen anderen Mechanismus (z. B. im shellHook exportieren).
mkShellNoCC
pkgs.mkShell zieht standardmäßig eine C-Toolchain herein. Brauchst du keinen Compiler
(reine Skript-/Web-Umgebung), spart pkgs.mkShellNoCC diese Abhängigkeit.
Nicht spicken – Abrufen aus dem Gedächtnis ist genau die Übung, die hängen bleibt.
Wie definierst du in mkShell eine Umgebungsvariable?
Jedes nicht reservierte, string-fähige Attribut wird zur env var: PROJECT = "toolbox";.
Der shellHook-Export geht auch, ist aber nur für dynamische Werte nötig.
Welcher Schlüssel passt für Tools, die du in der Shell nutzt?
packages ist der moderne Standard für „Tools, die ich benutze". buildInputs
sind Link-Libraries, inputsFrom erbt die Inputs anderer Pakete.
Wann läuft der shellHook?
Der shellHook ist ein Stück Shell-Code, das einmal beim Eintritt in die Umgebung
ausgeführt wird – ideal für Begrüßung und Setup.
Ziel: Die toolbox-Shell mit env var und Begrüßungs-Hook ausstatten.
mkShell ein Attribut PROJECT = "toolbox"; hinzu.shellHook, der beim Betreten "→ $PROJECT bereit" ausgibt.git add, dann nix develop – siehst du die Begrüßung?echo $PROJECT, dass die Variable gesetzt ist.Tipp: Innerhalb des ''…''-Strings benutzt du normale Shell-Syntax mit $PROJECT.
default = pkgs.mkShell {
packages = [ pkgs.go pkgs.jq ];
PROJECT = "toolbox";
shellHook = ''
echo "→ $PROJECT bereit"
'';
};
# nix develop → "→ toolbox bereit"
# echo $PROJECT → toolbox
Damit ist die Shell „komplett" – als Nächstes machen wir sie mit Lock-Files reproduzierbar.
pkgs.mkShell.
Die maßgebliche Referenz. Lies, wie packages, inputsFrom und env-Attribute
behandelt werden – kurz, aber definitiv.
packages oder
nativeBuildInputs gehört? Beschreib mir dein Projekt – ich ordne die Tools mit dir zu.
flake.lock, pinnen, nix flake update)