Nix Developer Shells · Workshop Lektion 13 / Profi-Kniffe

Besonderheiten & Profi-Kniffe

Die Sammlung an Wissen, die im Workshop die „Aber was, wenn…?"-Fragen beantwortet.

Warum das zählt
Du beherrschst jetzt den ganzen Weg: Sprache → Flake → mkShell → Lock → eigenes Paket → direnv. Diese Lektion bündelt die Detailfragen, die in jedem echten Einsatz auftauchen – damit du im Workshop souverän antwortest statt zu raten.

1 · nix develop vs. nix-shell

Zwei Generationen für dasselbe Ziel. Du erkennst beide draußen:

modern (Flakes) klassisch
flake.nix + flake.lock shell.nix (kein Lock)
nix develop nix-shell
gepinnt & teilbar by default pinnen nur manuell (z. B. niv)

Unser Kurs nutzt den modernen Weg – wegen der Lock-Files, deinem Lernziel. Beide bauen auf mkShell.

2 · pure vs. impure

nix develop ist pure: Es blendet die meisten Variablen deines Systems aus, damit die Umgebung überall gleich ist. Manchmal brauchst du aber etwas von außen (eine System-Variable, einen lokalen Pfad):

$ nix develop --impure     # lässt das System-Environment durch
--impure ist ein Notausgang Es bricht bewusst die Reproduzierbarkeit auf. Sparsam einsetzen und dokumentieren – sonst läuft es „bei dir", weil deine Maschine etwas mitbringt, das anderen fehlt.

3 · Garbage Collection & GC-Roots

Der Store wächst. nix-collect-garbage löscht alles, was nicht erreichbar ist. Erreichbar = von einem GC-Root referenziert. Was du wissen musst:

$ nix-collect-garbage          # räumt unerreichbare Store-Pfade weg
$ nix-collect-garbage -d       # zusätzlich alte Profil-Generationen

4 · Binary Caches & Substituters

Vertiefung aus Lektion 12: cache.nixos.org ist der Default-Substituter. Eigene Caches (Cachix, attic) ergänzt man projekt- oder systemweit. Faustregel: Selbst gebaute Pakete in der CI einmal bauen und in einen Team-Cache pushen – dann lädt jede:r nur noch.

Das ganze Bild

Sprache

Werte, Sets, Funktionen

Flake

inputs/outputs + lock

mkShell

Dev-Umgebung

Paket

buildGoModule

direnv

automatisch & schnell
Der rote Faden des Kurses – jetzt durchgängig in deiner Hand.
Dein Win – der ganze Kurs Du kannst die Nix-Sprache lesen und schreiben, eine reproduzierbare Dev-Shell mit mkShell bauen, sie über flake.lock pinnen, ein eigenes Paket bauen und einbinden, und das Ganze per direnv bequem machen. Das ist exakt die Mission – erfüllt. Jetzt kannst du es unterrichten.

Kurz prüfen (aus dem Kopf)

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

Was bedeutet „nix develop ist pure"?

Warum überlebt deine aktive Dev-Shell ein nix-collect-garbage?

Welcher Weg pinnt Versionen von Haus aus?

Abschluss-Übung – das ganze toolbox-Flake

Ziel: Eine produktionsreife flake.nix, die alles aus dem Kurs vereint.

  1. Pinne Nixpkgs auf einen stabilen Release (nixos-24.11) und committe die flake.lock.
  2. Baue eine mkShell mit Tools, einer env var und einem Begrüßungs-shellHook.
  3. Binde dein toolbox.nix-Paket per callPackage als packages.default ein und nimm es in die Shell auf.
  4. Lege eine .envrc mit use flake an und teste den automatischen Eintritt.

Das ist die Vorlage, die du im Workshop austeilen kannst – sie zeigt jedes Konzept des Kurses an einem Stück.

Lösung anzeigen
{
  description = "toolbox dev environment";
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";

  outputs = { self, nixpkgs }:
    let
      system  = "x86_64-linux";
      pkgs    = nixpkgs.legacyPackages.${system};
      toolbox = pkgs.callPackage ./toolbox.nix {};
    in {
      packages.${system}.default = toolbox;
      devShells.${system}.default = pkgs.mkShell {
        packages  = [ pkgs.go pkgs.jq toolbox ];
        PROJECT   = "toolbox";
        shellHook = ''echo "→ $PROJECT bereit"'';
      };
    };
}
# + echo "use flake" > .envrc && direnv allow

Sprache, Flake, Lock, mkShell, eigenes Paket, direnv – alles in einer Datei. Das ist deine Mission, fertig.

Primärquelle zum Lesen Nix Manual – Garbage Collection und der NixOS & Flakes Book für vertiefende Praxis.
Ich bin dein Teacher. Du willst den Workshop jetzt durchspielen oder ein reales Projekt auf Nix heben? Bring mir das Projekt – wir bauen die flake.nix gemeinsam und gehen die kniffligen Stellen durch.
← Lektion 12 · direnv & Caching Zur Kursübersicht
Geschafft – der ganze Kurs. Als Referenz bleiben Glossar und Sprach-Spickzettel.