Eine flake.nix: der standardisierte, gepinnte Einstiegspunkt für dein Projekt.
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.
flake.nix – beschreibt inputs (woher kommt Nixpkgs?)
und outputs (was bietet dieses Projekt an?).flake.lock – pinnt jeden Input exakt. Erzeugt Nix automatisch
(Details in Lektion 8).flake.nixDas 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 ];
};
};
}
description,
inputs, outputs.inputs sagt: „ich hänge von nixpkgs ab, und zwar vom Branch
nixos-unstable auf GitHub." Das ist deine Paketquelle aus Lektion 4.outputs ist eine Funktion (Lektion 3!). Ihr Set-Argument
{ self, nixpkgs } liefert die aufgelösten Inputs herein.pkgs = nixpkgs.legacyPackages.${system} holt das pkgs-Set für deine
Architektur. Ab hier ist alles wie gewohnt.devShells.<system>.default ist der Output, den nix develop sucht.
Mehr dazu in Lektion 6.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
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.
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.
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).
nixpkgs.lib.genAttrs oder dem Helfer flake-utils.lib.eachDefaultSystem.
Das holen wir bei Bedarf nach; fürs Lernen bleibt ein System übersichtlicher.
Nicht spicken – Abrufen aus dem Gedächtnis ist genau die Übung, die hängen bleibt.
Was ist outputs in einer flake.nix?
outputs = { self, nixpkgs }: { … } ist eine Funktion mit Set-Argument – genau das Muster
aus Lektion 3. Die aufgelösten Inputs kommen als Argument herein.
Wozu dient der Abschnitt inputs?
inputs sagt, woher dein Flake seine Bausteine bezieht (welches Nixpkgs, welche
weiteren Flakes). Die Paketliste der Shell steht später in mkShell.
Warum sieht nix develop deine neue flake.nix nicht?
Flakes sehen nur von Git verfolgte Dateien. Ohne git add flake.nix existiert sie für
Nix nicht – ein extrem häufiger Stolperstein.
Ziel: Ein leeres toolbox-Flake anlegen und seine Outputs anschauen.
toolbox/ an und mach ihn zum Git-Repo (git init).flake.nix aus dieser Lektion und git add flake.nix.nix flake show aus und finde deinen devShells…default-Output.nix flake metadata an, auf welche Revision Nixpkgs gepinnt wurde.Tipp: Beim ersten nix flake-Befehl erzeugt Nix automatisch die flake.lock.
$ 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.
flake.nix-Struktur, Inputs/Outputs und den
nix flake-Befehlen. Lies „Flake schema" und „Input schema".
nix develop)