# Eine Einführung in NixOS Flakes (20.12.2024) Flakes sind ein experimentelles Feature von Nix welches jedoch von der Mehrheit der Nutzer verwendet wird. Mit Flakes wird eine Richtlinie für die Verwaltung von Abhängigkeiten zwischen Nix-Ausdrücken hinzugefügt. Dadurch gewinnt man eine bessere Reproduzierbarkeit. Flakes sind eines der wichtigsten Änderungen welche im Nix Projekt bisher eingeführt wurden. ## Was genau sind Flakes? Jeder Entwickler ist in seinem Leben wahrscheinlich an einer `package-lock.json` Datei vorbeigekommen. Diese Date wird zwar (im Normalfall) nicht von Hand geschrieben, bei einer Installation der Abhängigkeiten jedoch automatisch generiert. Der Nutzen dieser Datei liegt darin, dass die genaue Version der Abhängigkeiten gespeichert werden.[^2] Durch die Addition einer solchen Datei können wir die Reproduzierbarkeit unserer Umgebung stark erhöhen. Mit Flakes versucht Nix ein ähnliches System für ihren Package Manager zu gewähren. Wir erhalten also zu all unseren Flakes eine Lock-Datei mit den genauen Versionen. ## Installation Um Flakes in unserer Nix Umgebung nutzen zu können, muss es als experimentelles Feature aktiviert werden. Dazu braucht es auch noch den sogenannten `nix-command`. Das Feature kann temporär mit Nix aktiviert werden, in dem der folgende Tag an den Befehl angehängt wird: ```bash --experimental-features 'nix-command flakes' ``` In einer NixOS Umgebung kann es jedoch auch permanent über folgende Konfiguration aktiviert werden:[^1] ```bash nix.settings.experimental-features = [ "nix-command" "flakes" ]; ``` ## Nutzung > [!Warning] Flakes mit Git > Wenn die Flakes in einem Git Repository abgelegt sind, werden nur diejenigen Flakes beachtet, die sich auch im Working Tree befinden. Flakes die also nicht gestaged werden, werden von Nix auch ignoriert. Ein Flake ist ein Ordner mit zwei Dateien: - eine `flake.nix` Datei - und eine `flake.lock` Datei Flakes unterscheiden sich von herkömmlichen NixOS-Konfigurationen, da sie ein abstrakteres Konzept darstellen. Sie dienen als modulare Bausteine, die Inputs (zum Beispiel andere Flakes oder externe Abhängigkeiten) aufnehmen und strukturierte Outputs erzeugen. Diese Outputs können vielfältig sein: NixOS-Systemkonfigurationen, einzelne Pakete, Entwicklungsumgebungen oder komplette Toolchains.[^3] ### Struktur einer Flake Die zentrale Datei einer Flake, die `flake.nix`, definiert die Inputs und Outputs. Inputs beschreiben, welche externen Ressourcen oder Abhängigkeiten eine Flake benötigt. Das können andere Flakes aus Repositories wie GitHub, lokale Verzeichnisse oder auch spezifische Versionen von Paketen sein. Die Outputs hingegen legen fest, was die Flake bereitstellt. Zu den häufigsten Outputs gehören: 1. **Packages:** Pakete, die mit Nix gebaut werden können. 2. **Configurations:** Systemkonfigurationen, etwa für NixOS. 3. **Apps:** Anwendungen, die direkt gestartet werden können. 4. **DevShells:** Entwicklungsumgebungen, die mit allen notwendigen Tools und Abhängigkeiten ausgestattet sind. Diese klare Trennung zwischen Inputs und Outputs macht Flakes besonders mächtig und flexibel. Entwicklerinnen und Entwickler können Flakes beispielsweise verwenden, um reproduzierbare Entwicklungsumgebungen zu erstellen, komplexe Softwareprojekte zu verwalten oder NixOS-Systeme zu konfigurieren. ### `flake.lock` Während die `flake.nix` Datei für die Konzeption und Struktur der Flake verantwortlich ist, spielt die `flake.lock` Datei eine entscheidende Rolle für die Nachvollziehbarkeit und Stabilität. Sie speichert die exakten Versionen aller Abhängigkeiten, die während eines Builds verwendet wurden. Dadurch wird sichergestellt, dass Builds zu einem späteren Zeitpunkt mit denselben Ergebnissen reproduziert werden können, selbst wenn sich externe Quellen verändert haben. ### Warum Flakes? Flakes bieten eine moderne und standardisierte Möglichkeit, Projekte und Konfigurationen in Nix zu verwalten. Durch ihre modulare Struktur erleichtern sie nicht nur die Wiederverwendbarkeit von Code, sondern fördern auch kollaboratives Arbeiten und die Versionierung von Konfigurationen. Mit der Einführung von Flakes wird die Verwaltung komplexer Projekte deutlich einfacher. Sie ermöglichen eine konsistente und vorhersehbare Nutzung von Abhängigkeiten, minimieren potenzielle Fehlerquellen und bieten eine robuste Grundlage für die Arbeit mit Nix. ## Fazit Nix Flakes bieten eine moderne und flexible Lösung für die Verwaltung von Projekten, Konfigurationen und Abhängigkeiten in der Nix-Umgebung. Durch die klare Trennung von Inputs und Outputs sowie die flake.lock Datei ermöglichen sie reproduzierbare Builds, fördern Wiederverwendbarkeit und vereinfachen komplexe Workflows. Mit ihrem modularen Ansatz und der Unterstützung kollaborativer Arbeit sind Flakes ein wichtiger Schritt zur Weiterentwicklung des Nix-Ökosystems und machen das Arbeiten mit Nix effizienter und zuverlässiger. [^1]: vgl. Flakes, in: NixOS Wiki, 20.12.2024, https://nixos.wiki/wiki/flakes [^2]: vgl. package-lock.json, in: npm Docs, 20.12.2024, https://docs.npmjs.com/cli/v11/configuring-npm/package-lock-json [^3]: vgl. Nix Flakes, in: Zero to Nix, 20.12.2024, https://zero-to-nix.com/concepts/flakes/