Nix Developer Shells · Workshop Lektion 5 / Flakes & mkShell

Flakes-Grundlagen

Eine flake.nix: der standardisierte, gepinnte Einstiegspunkt für dein Projekt.

Warum das zählt
Ab hier wird die toolbox real. Die flake.nix ist die Datei, die deine Dev-Shell (und später deine Pakete) definiert – reproduzierbar und teilbar. Heute verstehst du ihre zwei Hälften: inputs und outputs.

Ein Flake ist ein Verzeichnis mit zwei Dateien

Die Anatomie der flake.nix

Das ist die ganze Datei für eine erste Dev-Shell – Zeile für Zeile danach erklärt:

{
  description = "toolbox dev environment";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
  };

  outputs = { self, nixpkgs }:
    let
      system = "x86_64-linux";
      pkgs   = nixpkgs.legacyPackages.${system};
    in {
      devShells.${system}.default = pkgs.mkShell {
        packages = [ pkgs.git pkgs.jq ];
      };
    };
}

Was hier passiert

Die wichtigsten nix flake-Befehle

$ nix flake init        # legt eine flake.nix aus einer Vorlage an
$ nix flake show        # listet alle Outputs (devShells, packages, …)
$ nix flake metadata    # zeigt Inputs und ihre gepinnten Revisionen
$ nix flake check       # wertet alle Outputs aus und prüft auf Fehler
Dein Win Du kannst eine flake.nix jetzt vollständig lesen: Du erkennst das äußere Set, die outputs-Funktion und den Weg von nixpkgs zu pkgs. In Lektion 6 betrittst du die so definierte Shell.

Besonderheiten & Stolperfallen

Flake-Dateien müssen in Git sein Nix sieht in einem Flake nur Dateien, die Git kennt. Eine neue flake.nix ohne git add führt zu „path does not exist" oder „file not found". Reflex: erst git add flake.nix, dann nix develop.
Ein Output pro System Outputs sind nach system (x86_64-linux, aarch64-darwin, …) gegliedert. Unser Beispiel ist auf ein System fest verdrahtet – einfach zum Lernen, aber nicht portabel. Echte Flakes erzeugen die Outputs für mehrere Systeme (siehe Note).
Mehrere Systeme sauber abdecken Statt das System hart zu verdrahten, iteriert man über eine Liste – oft mit nixpkgs.lib.genAttrs oder dem Helfer flake-utils.lib.eachDefaultSystem. Das holen wir bei Bedarf nach; fürs Lernen bleibt ein System übersichtlicher.

Kurz prüfen (aus dem Kopf)

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

Was ist outputs in einer flake.nix?

Wozu dient der Abschnitt inputs?

Warum sieht nix develop deine neue flake.nix nicht?

Übung für Teilnehmende

Ziel: Ein leeres toolbox-Flake anlegen und seine Outputs anschauen.

  1. Lege einen Ordner toolbox/ an und mach ihn zum Git-Repo (git init).
  2. Erstelle die flake.nix aus dieser Lektion und git add flake.nix.
  3. Führe nix flake show aus und finde deinen devShells…default-Output.
  4. Schau dir mit nix flake metadata an, auf welche Revision Nixpkgs gepinnt wurde.

Tipp: Beim ersten nix flake-Befehl erzeugt Nix automatisch die flake.lock.

Lösung anzeigen
$ mkdir toolbox && cd toolbox && git init
$ # flake.nix aus der Lektion hineinkopieren
$ git add flake.nix
$ nix flake show
# └───devShells
#     └───x86_64-linux
#         └───default: development environment 'nix-shell'
$ nix flake metadata   # zeigt nixpkgs + gepinnten Commit

Damit steht das Gerüst. In Lektion 6 betrittst du diese Shell.

Primärquelle zum Lesen NixOS Wiki – Flakes. Die praxisnahe Referenz zu flake.nix-Struktur, Inputs/Outputs und den nix flake-Befehlen. Lies „Flake schema" und „Input schema".
Ich bin dein Teacher. Unsicher beim System-Handling oder beim Multi-System-Helfer? Sag mir, auf welcher Architektur du arbeitest – ich gebe dir die passende, portable Flake-Vorlage.
← Lektion 4 · Nixpkgs & pkgs Lektion 6 · mkShell I →
Als Nächstes: Lektion 6 – mkShell I (erste Dev-Shell, nix develop)