⊠ist ein schwĂ€bisches Sprichwort und passt gar nicht so schlecht fĂŒr die vielen schlechten Wortwitze die sich automatisch ergeben, wenn man anfĂ€ngt, sich in das Nix Projekt einzuarbeiten.
ZunĂ€chst mal die Karotte mit der ich mich ködern lieĂ:
- Deklarative Konfiguration von Software-Builds, System-Konfigurationen, und wenn man möchte auch Deployments z.B. in Kubernetes und was man sonst gerne möchte
- Ein funktionaler Paket-Manager, das heiĂt: Jede Software kann ihre eigenen AbhĂ€ngigkeiten in der passenden Version haben. Wenn ich mal ein Tool in der Version von vor 10 Jahren brauche - einfach zusĂ€tzlich installieren, ohne dass dadurch etwas gestört wird. Wenn ich mal eine neuere Version von etwas brauche als die aktuelle Distribution anbietet: Einfach installieren, ohne dass dadurch etwas gestört wird.
- Rollback: Systemkonfiguration hat etwas kaputt gemacht? Einfach RĂŒckgĂ€ngig machen.
- Update auf eine neue Version des Betriebssystems: Man kriegt fehlermeldungen fĂŒr alle Konfigurationen die man vorgenommen hat die jetzt umbenannt wurden oder anders funktionieren. đ€Ż
- Reproduzierbarkeit: VollstÀndige Erfassung der Inputs und Ablegen derselben in einem Lock-File.
- Eine riesige Community, die beste Praktiken zum Betrieb von Linux (und mehr) Systemen in die gröĂte Software-Bibliothek kodiert, die wir bisher gesehen haben.
Was sollte man da nicht mögen?
Auf MacOs gibt es mit nix-darwin ein Projekt mit dem man die System-Konfiguration deklarativ vornehmen kann - und auch homebrew (was sonst so gut wie gar nicht reproduzierbar ist) unter Kontrolle kriegt. Und wenn man möchte, verwaltet es einem auch die dotfiles.
Es gibt allerdings einen gewaltigen Nachteil: Das Ganze ist echt komplex und kompliziert. Und die Dokumentation ist nicht schlecht, aber könnte deutlich besser sein.
Wenn man diese HĂŒrde ĂŒberwindet, wird man mit einer erstaunlich kompakten und sehr schnell anzuwendenden System-Konfiguration belohnt. Damit kann man zum Beispiel auf einem Mac ein vollstĂ€ndig konfiguriertes System-Image fĂŒr einen Raspberry Pi erstellen. Dann noch flaschen, starten und lĂ€uft! Oder auf meinem Mac Bauen, und via ssh auf dem RasPi deployen, ohne dort irgendwas zu machen was dessen CPU stresst.
Ich habe inzwischen angefangen, meine Rechner damit zu verwalten und konfigurieren.
Nix ist vielleicht nichts fĂŒr dichâŠ
⊠aber wenn Du ein bisschen nerdig bist, und gerne auf der Kommandozeile lebst, infrastruktur as Code magst oder lernen magst und DevOps fĂŒr dich eh normal ist. Dann könnte Nix auch fĂŒr dich genau das richtige sein.
Wie lernt man Nix am besten?
Was mir beim Lernen von Nix gefehlt hat, wÀre eine Leitlinie gewesen, in welcher Reihenfolge ich mich an die vielen Features von Nix heran tasten sollte. Eine Reihenfolge, die sicherstellt, das die Lernkurve zu jedem Zeitpunkt ertrÀglich bleibt. Und besonders wichtig: Die Sicherstellt, das zu jedem Zeitpunkt sichtbar ist wie cool und wertvoll diese Technologie ist. Sonst lÀuft man Gefahr, ob der steilen Lernkurve abzuspringen.
Das hÀtte ich gerne gehabt: Wenn du anfÀngst Nix zu lernen, dann am besten in dieser Reihenfolge:
1. Schritt: Installieren, ohne was bestehendes kaputt zu machen
Zuerst sollte man Nix neben dem aktuellen OS installieren. Der Standard ist der Determinate Installer, aber ich mag das Lix Projekt lieber, da es schneller ist. Alternativ ist auch der Nix-Docker-Container super um es mal auszuprobieren. Wenn man möchte, kann man Nix (auf Linux) auch einfach in einen Ordner installieren und so verwenden (siehe "Single-User Mode"). Das wĂŒrde ich aber nur fĂŒr ein paar Experimente empfehlen. Sowohl der Determinate als auch der Lix-Installer haben sehr gute Uninstaller die das Projekt auch wieder komplett entfernen können.
2. Schritt: Imperativ verwenden
Nix erlaubt es jederzeit ein Paket zu benutzen, ohne es zu installieren. Das ist eine Konsequenz davon wie der Paket-Manager aufgebaut ist. Ein Paket kann 'im /nix/store/
sein' - ohne das es aktiv ist. Und der Befehl nix run nixpkgs#fzf
startet es dann einfach - ohne es zu installieren. Alternativ gibt es auch nix shell nixpkgs#fzf
. Damit erhÀllt man eine Shell, in der fzf
installiert ist. SchlieĂt man die Shell, ist es auch wieder weg. đł
Dass ist der Hammer, weil man so Pakete ohne Reue ausprobieren kann. Ohne Sorgen, dass doch noch irgendwelche AbhÀngigkeiten evtl. auf dem System herum gurken und man vergessen könnte ein Experiment wieder zu entfernen. Und das beste: Auch spÀter wird man dieses Feature die ganze Zeit verwenden.
Vorsicht vor nix-env
und nix profile
- das ist das Ăquivalent zu dem wie man mit homebrew
und anderen Paketmanagern Pakete installieren wĂŒrde. Diese sollte man so selten wie möglich verwenden. Besser istâŠ
3. Schritt: Entwicklungsumgebungen shell.nix
Das, was nix shell nixpkgs#fzf
macht, kann man auch in eine Datei schreiben, und damit einfach in ein Repo mit einchecken. Schon hat man Deklarativ die ganzen Tools im Repo dokumentiert, die man braucht um mit einem Projekt zu arbeiten. Bonus: Ich kann fĂŒr jedes Projekt eigene Versionen der AbhĂ€ngigkeiten haben (wenn ich das brauche). Python-Virtual-Envs auf Steroiden!
Hier ein Beispiel:
{ pkgs ? import <nixpkgs> { }, }: pkgs.mkShell { buildInputs = with pkgs; [ # Add your build inputs here pkgs.python313 pkgs.uv ]; env = { UV_PYTHON = pkgs.python313; UV_DOWNLOAD_PYTHON = "never"; }; }
Wenn man das mit nix-shell
aufruft, dann hat man diese Python-Version zur Hand. uv
verwendet diese und lÀdt selber keine Python-Versionen herunter. Nice! Extra nice: mit nix-shell --pure
hat man eine Shell in der nur das sichtbar ist was in dem shell.nix
steht, und man kriegt Fehler fĂŒr alles was man verwendet und in der shell.nix
vergessen hat. đ€Ż
Bonus: Direnv verwenden um automatisch die shell.nix
und das .env
zu laden. Dazu zoxide um schnell in der Shell zwischen vielen Projekten hin und zu springen. Eine richtig geniale Entwicklungsumgebung.
Ich empfehle erst mal eine weile auf diesem Niveau zu bleiben, denn das ist schon ziemlich cool!
4. Schritt: Mehr Tooling um besser mit Nix klar zu kommen
- Pakete findet man am besten ĂŒber die Webseite search.nixos.org - aber ich mag eigentlich in der shell suchen.
nix run nixpkgs#nh search ut1999
funktioniert besser als alles was ich sonst bisher getestet habe. - Anzeigen was gerade installiert ist und wieso ist aufgrund der Architektur von nix gar nicht so einfach.
nix run nixpkgs#nix-tree
aproximiert das und gibt einen guten ĂŒberblick darĂŒber was man auf dem System hat. nom
- der Nix-Output-Monitornix run nixpkgs#nix-output-monitor
macht den output von lÀngeren nix builds viel informativer und spannender. Verwenden kann man das so:nix run $something |& nix run nixpkgs#nix-output-monitor
nix store gc
um alles zu löschen, was man mal testweise runtergeladen hat und nicht mehr auf der Platte braucht. (Einer Der Nachteile von Nix: Es verbraucht schnell viel Plattenplatz).
5. Schritt: Tief in das Hasenloch fallen
Jetzt gibt es verschiedene Sachen die man sich anschauen könnte
- Die Nix Sprache lernen - die Voraussetzung fĂŒr fast alles was danach kommt, also gut investierte Zeit. Und es ist eine wirklich kleine Sprache - auch wenn die 'Standard-Bibliothek' (meiner Meinung nach das NixPKGs Repository) alles andere als klein ist.
- devenv um Entwicklungsumgebungen kurz und Knackig und mit allen Features deklarativ zu beschreiben und ins Projekt eingecheckt zu bekommen.
- Flakes - der Standard in der Nix-Community, mit der AbhÀngigkeits-Versionen festgeschrieben werden. Also wie checke ich die genauen git commit hashes die ich verwendet habe um alle meine Software zu bauen ins Repo mit ein. Damit kann man ein Projekt auch nach Jahren sehr einfach verlÀsslich wieder bauen.
- uv2nix - wie man Python-Projekte Nix-ifiziert
- nix-darwin um ein MacOS System so deklarativ zu verwalten, wie das unter NixOS geht. (OK, Apple setzt da grenzen, aber das ist trotzdem sehr cool).
- home-manager um dotfiles zu verwalten und auf Benutzer-Ebene alles zu konfigurieren.
- Quasi alles von Awesome-Nix.
- Und so viele Projekte mehr, die man sich anschauen könnteâŠ