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
| Typ | Beispiel | Hinweis |
| Integer / Float | 42 · 3.14 | — |
| Boolean | true · false | — |
| null | null | — |
| String | "hallo" | Interpolation mit ${…} |
| Mehrzeiliger String | ''…'' | Einrückung wird abgezogen |
| Pfad | ./app · /etc | Eigener Typ, kein String! |
| Liste | [ 1 "a" pkgs.git ] | Leerzeichen-getrennt, keine Kommas |
| Attribute-Set | { x = 1; y = 2; } | Jede Zuweisung endet mit ; |
| Funktion | x: x + 1 | Genau 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
| Operator | Bedeutung |
// | 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 |
or | Default bei Zugriff: set.key or "fallback" |
if … then … else … | Ist ein Ausdruck (liefert einen Wert), kein Statement |
Nützliche Builtins / lib-Funktionen
| Funktion | Wozu |
builtins.fetchurl / fetchGit | Quellen holen |
map f liste | Jede Liste-Element transformieren |
lib.optionals cond [ … ] | Liste nur bei Bedingung anhängen (für plattformabhängige Tools) |
lib.makeBinPath | PATH aus einer Paketliste bauen |
import ./datei.nix | Eine 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