Nix Developer Shells · Workshop Lektion 1 / Einführung

Was ist Nix?

Deklarativ & reproduzierbar – und deine erste Shell mit einem Tool, das du gar nicht installiert hast.

Warum das zählt
Am Ende dieser Lektion verstehst du das Vokabular (Nix, Nixpkgs, Derivation, Store) und kannst erklären, warum Nix-Umgebungen reproduzierbar sind. Das ist das Fundament, auf dem die Nix-Sprache, mkShell und dein Workshop aufbauen.

Das Problem, das Nix löst

Jedes Projekt-README kennt den Abschnitt „Voraussetzungen": installiere Node 20, Postgres 15, ein bestimmtes CLI, setze diese Umgebungsvariable…. Auf deiner Maschine läuft es, bei der neuen Kollegin nicht, in der CI wieder anders. Das ist imperatives Setup: eine Abfolge von Schritten, deren Ergebnis von deinem Rechner abhängt.

Nix dreht das um. Du beschreibst die gewünschte Umgebung in einer Datei – welche Tools, welche Versionen – und Nix stellt genau diese Umgebung her. Bit-genau gleich, auf jeder Maschine. Das ist deklarativ und reproduzierbar.

Unser durchgehendes Beispiel

Statt „Hello World" begleitet uns durch den Kurs eine kleine, realistische Aufgabe: eine geteilte Dev-Umgebung für ein Projekt namens „toolbox". Wir bauen sie Lektion für Lektion aus – am Ende mit eigener flake.nix, einer mkShell-Umgebung, gepinnter flake.lock und einem selbst gebauten CLI-Tool:

toolbox/
├── flake.nix      # ← beschreibt Dev-Shell + eigene Pakete (ab Lektion 5)
├── flake.lock     # ← pinnt alles exakt (Lektion 8)
└── src/           # der eigentliche Projekt-Code

Heute fangen wir ganz vorne an: Wir holen uns ein Tool in eine Shell, ohne es zu installieren.

Die vier Begriffe

Vier Bausteine erklären, wie Nix denkt. Mehr brauchst du fürs Erste nicht:

Der rote Faden: Eine Nix-Datei wird zu einer Derivation ausgewertet; Nix realisiert sie dann in den Store. Weil der Store-Pfad ein Hash über alle Inputs ist, ergeben gleiche Inputs garantiert dasselbe Ergebnis – das ist die ganze Magie der Reproduzierbarkeit.

Beschreibung

.nix-Datei

auswerten

Derivation

realisieren

/nix/store/hash-…
Von der Beschreibung zum fertigen Ergebnis. Der Hash im Store-Pfad fasst alle Inputs zusammen.

Deine erste Nix-Shell

Genug Theorie. Angenommen, du brauchst kurz das Tool cowsay, hast es aber nicht installiert. Mit Nix holst du es dir in eine temporäre Shell – ohne dein System zu verändern:

# holt cowsay aus nixpkgs in eine neue Shell
$ nix shell nixpkgs#cowsay

# jetzt ist cowsay verfügbar – nur in dieser Shell
$ cowsay "Reproduzierbar!"

# Shell verlassen – cowsay ist wieder weg, System unverändert
$ exit

Was hier passiert

Dein erster Win Du kannst jetzt jedes Tool aus Nixpkgs ausprobieren, ohne etwas zu installieren oder kaputtzumachen – und in Worten erklären, warum: Nix legt es isoliert in den Store und macht es nur in dieser Shell sichtbar.

Klassisch vs. modern

Dir werden draußen zwei Schreibweisen begegnen. Wir gehen den modernen Weg (Flakes), weil er Lock-Files mitbringt – dein erklärtes Lernziel. Zum Wiedererkennen:

# modern (Flakes) – dieser Kurs:
$ nix shell nixpkgs#cowsay

# klassisch (du wirst es in alten Anleitungen sehen):
$ nix-shell -p cowsay

Besonderheiten & Stolperfallen

Flakes sind (noch) „experimentell" Die nix-Befehle aus diesem Kurs brauchen einmalig ein Opt-in. Setze in ~/.config/nix/nix.conf die Zeile experimental-features = nix-command flakes – sonst meckert Nix bei jedem Befehl.
Installieren ist nicht das Ziel Der Reflex „ich installiere das global mit nix-env -i" untergräbt genau die Reproduzierbarkeit. Im Kurs installieren wir fast nie global – wir beschreiben Umgebungen pro Projekt. Merke dir nix-env als das, was du nicht tust.
Sprache ≠ Tool „Nix" meint je nach Satz den Package-Manager oder die Sprache. Wir trennen das im Kurs: Lektionen 2–3 sind die Sprache, alles andere nutzt das Tool.

Kurz prüfen (aus dem Kopf)

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

Worin liegt die Reproduzierbarkeit von Nix begründet?

Was beschreibt der Begriff „Derivation" am besten?

Was passiert nach exit aus nix shell?

Übung für Teilnehmende

Ziel: Reproduzierbarkeit am eigenen Rechner spüren – ohne irgendetwas zu installieren.

  1. Aktiviere Flakes (siehe Stolperfalle oben), falls noch nicht geschehen.
  2. Hole dir cowsay und lolcat gleichzeitig in eine Shell.
  3. Lass dir mit which cowsay zeigen, wo das Binary wirklich liegt.
  4. Verlasse die Shell und prüfe, dass cowsay draußen nicht (mehr) existiert.

Tipp: Mehrere Pakete hängst du als weitere nixpkgs#…-Argumente an.

Lösung anzeigen
$ nix shell nixpkgs#cowsay nixpkgs#lolcat
$ cowsay "hi" | lolcat
$ which cowsay
# → /nix/store/xxxx…-cowsay-3.04/bin/cowsay  (im Store, nicht /usr/bin!)
$ exit
$ which cowsay
# → cowsay not found  (System war nie verändert)

Genau dieser Store-Pfad ist der Grund, warum es überall gleich funktioniert.

Primärquelle zum Lesen nix.dev – First steps. Die offizielle, didaktisch saubere Einführung. Lies „Ad hoc shell environments" – du wirst nix shell und die Begriffe jetzt wiedererkennen.
Ich bin dein Teacher. Wenn etwas unklar ist – warum der Store ein Hash ist, wie sich Flakes vom klassischen nix-shell unterscheiden, oder wie das toolbox-Beispiel später aussieht – frag einfach im Chat nach. Genau dafür bin ich da.
Glossar & Begriffe Kursübersicht
Als Nächstes: Lektion 2 – Nix-Sprache I (Werte, Strings, Listen, let … in)