Nix Developer Shells · Workshop Referenz

Nix-Sprache: Spickzettel

Die ganze Syntax, die du für Dev-Shells brauchst, auf einer Seite. „Nix ist JSON mit Funktionen." Zum Ausdrucken gemacht.

So liest du Nix: Eine Nix-Datei ist ein einziger Ausdruck, der zu einem Wert ausgewertet wird. Kein Statement-für-Statement wie in Python – alles ist ein Ausdruck, der einen Wert ergibt.

Werte & Typen

TypBeispielHinweis
Integer / Float42 · 3.14
Booleantrue · false
nullnull
String"hallo"Interpolation mit ${…}
Mehrzeiliger String''…''Einrückung wird abgezogen
Pfad./app · /etcEigener Typ, kein String!
Liste[ 1 "a" pkgs.git ]Leerzeichen-getrennt, keine Kommas
Attribute-Set{ x = 1; y = 2; }Jede Zuweisung endet mit ;
Funktionx: x + 1Genau ein Argument

Attribute-Sets

{
  name = "toolbox";
  version = "1.0";
  nested = { a = 1; };
}

# Zugriff mit Punkt:
config.nested.a        # => 1

# rec = Attribute dürfen sich gegenseitig referenzieren:
rec { a = 1; b = a + 1; }   # b => 2

let … in  ·  with  ·  inherit

# let bindet lokale Namen, in liefert den Ergebnis-Ausdruck:
let
  x = 10;
  y = 20;
in x + y                 # => 30

# with bringt die Attribute eines Sets in den Scope:
with pkgs; [ git ripgrep ]   # statt pkgs.git pkgs.ripgrep

# inherit kopiert gleichnamige Namen aus dem Scope ins Set:
let name = "x"; version = "1"; in
{ inherit name version; }   # = { name="x"; version="1"; }

Funktionen

# Ein Argument:
double = x: x * 2;            double 21   # => 42

# Mehrere Argumente = verschachtelte Funktionen (Currying):
add = a: b: a + b;          add 3 4  # => 7

# Set als Argument (Pattern) – so sehen fast alle Nix-Funktionen aus:
mkApp = { name, version ? "0.1" }: "${name}-${version}";
mkApp { name = "toolbox"; }   # => "toolbox-0.1"  (version per default)

# ... lässt zusätzliche Attribute zu:
f = { a, ... }: a;

Operatoren, die oft vorkommen

OperatorBedeutung
//Sets zusammenführen (rechts gewinnt): {a=1;} // {a=2;b=3;}
++Listen verketten: [1 2] ++ [3]
+Zahlen addieren oder Strings/Pfade verketten
?Test, ob ein Attribut existiert: set ? key
orDefault bei Zugriff: set.key or "fallback"
if … then … else …Ist ein Ausdruck (liefert einen Wert), kein Statement

Nützliche Builtins / lib-Funktionen

FunktionWozu
builtins.fetchurl / fetchGitQuellen holen
map f listeJede Liste-Element transformieren
lib.optionals cond [ … ]Liste nur bei Bedingung anhängen (für plattform­abhängige Tools)
lib.makeBinPathPATH aus einer Paketliste bauen
import ./datei.nixEine andere Nix-Datei einlesen & auswerten
Top-Stolperfallen der Syntax Listen ohne Kommas ([ a b c ]). · Jede Set-Zuweisung endet mit ;. · ./pfad ist ein Pfad, kein String. · Eine Datei ist ein Ausdruck – kein return, kein Semikolon am Ende der Datei.

← Zur Kursübersicht · ← Glossar