Nix Developer Shells · Workshop Lektion 12 / Profi-Kniffe

direnv & Caching

Die Shell betritt sich von selbst – und tut das schnell. Der Komfort, der Nix im Alltag tragbar macht.

Warum das zählt
Im Workshop ist das der „Aha"-Moment: Du cd in ein Projekt – und die Dev-Shell ist einfach da, in deiner gewohnten Shell, ohne nix develop zu tippen. Mit Caching wird das auch noch sofort schnell. Das verwandelt Nix von „mächtig, aber umständlich" in „mächtig und bequem".

Das Problem, das direnv löst

nix develop ist toll, aber: Du musst es tippen, es wirft dich in eine nackte bash (Lektion 6), und beim Projektwechsel vergisst man es. direnv betritt & verlässt die Umgebung automatisch, sobald du das Verzeichnis betrittst oder verlässt – in deiner eigenen Shell.

Einrichtung in drei Schritten

# 1) direnv + nix-direnv installieren (z.B. via Home-Manager oder nix profile)
#    und den direnv-Hook in deine ~/.zshrc / ~/.config/fish einbinden.

# 2) Im Projekt eine .envrc anlegen:
$ echo "use flake" > .envrc

# 3) einmal freischalten (Sicherheits-Opt-in):
$ direnv allow

Ab jetzt gilt: cd toolbox/ → Shell ist aktiv (Tools, env vars, shellHook aus Lektion 7). cd .. → alles wieder weg. Du tippst nie wieder nix develop.

use flake vs. use nix use flake lädt devShells.default aus deiner flake.nix – unser Weg. use nix ist das Pendant für ein klassisches shell.nix. Beide kommen von nix-direnv.

Caching: warum nix-direnv?

Reines direnv würde die Umgebung bei jedem cd neu auswerten – spürbar langsam. nix-direnv cached das Ergebnis und hält es als GC-Root (Lektion 13: schützt vor Garbage Collection). Resultat: Der erste Eintritt baut/lädt, jeder weitere ist praktisch instant.

Binary Caches: nicht alles selbst bauen

Ein zweiter Beschleuniger, der schon ab Lektion 1 still mitläuft: Binary Caches. Statt jedes Paket lokal zu kompilieren, lädt Nix vorgebaute Ergebnisse aus cache.nixos.org (dem offiziellen Substituter). Deshalb ging nix shell nixpkgs#cowsay in Sekunden statt Minuten.

# eigene/teamweite Caches ergänzt man als zusätzliche substituters:
$ nix develop --option substituters \
    "https://cache.nixos.org https://dein-team.cachix.org"

Für Teams baut man eigene Pakete einmal in der CI und lädt sie über einen Cache (z. B. Cachix) zu allen – niemand baut die toolbox-CLI doppelt.

Dein Win Deine Dev-Umgebung ist jetzt nicht nur reproduzierbar, sondern auch bequem und schnell: automatisch aktiv per direnv, instant dank Cache. Das ist genau das Erlebnis, das deine Workshop-Teilnehmenden überzeugt.

Besonderheiten & Stolperfallen

.envrc braucht direnv allow Aus Sicherheit führt direnv eine neue oder geänderte .envrc erst nach direnv allow aus. „direnv: error .envrc is blocked" heißt schlicht: einmal erlauben.
.direnv/ ins .gitignore nix-direnv legt einen lokalen Cache-Ordner .direnv/ an. Der gehört nicht ins Repo – aber die .envrc schon (sie ist Teil der geteilten Umgebung).
Ohne nix-direnv ist es langsam Reines direnv + use flake funktioniert, cached aber nicht und hält keinen GC-Root. Installier nix-direnv – ohne den fehlt der halbe Nutzen.

Kurz prüfen (aus dem Kopf)

Nicht spicken – Abrufen aus dem Gedächtnis ist genau die Übung, die hängen bleibt.

Was bewirkt eine .envrc mit use flake?

Wozu dient nix-direnv gegenüber reinem direnv?

Warum ging nix shell nixpkgs#cowsay in Sekunden?

Übung für Teilnehmende

Ziel: Die toolbox-Shell per direnv automatisch betreten.

  1. Stelle sicher, dass direnv + nix-direnv installiert und der Hook aktiv ist.
  2. Lege im Projekt echo "use flake" > .envrc an und führe direnv allow aus.
  3. Verlasse den Ordner und betritt ihn erneut – siehst du deinen shellHook-Gruß?
  4. Ergänze .direnv/ in der .gitignore, committe die .envrc.

Tipp: direnv reload erzwingt ein erneutes Laden, ohne den Ordner zu wechseln.

Lösung anzeigen
$ echo "use flake" > .envrc
$ direnv allow
# direnv: loading .envrc
# → toolbox bereit        (dein shellHook aus Lektion 7)
$ echo ".direnv/" >> .gitignore
$ git add .envrc .gitignore

Ab jetzt ist die richtige Umgebung in jedem Projekt automatisch da.

Primärquelle zum Lesen nix-community/nix-direnv – README. Die maßgebliche Anleitung zu use flake, Caching und GC-Roots. Kurz, praxisnah, aktuell.
Ich bin dein Teacher. direnv lädt nicht, oder der Hook fehlt in deiner fish-Config? Sag mir deine Shell – ich gebe dir die exakte Hook-Zeile.
← Lektion 11 · Paket in die Dev-Shell Lektion 13 · Besonderheiten →
Als Nächstes: Lektion 13 – Besonderheiten (pure/impure, GC, Binary Caches, Abschluss)