Logo von Thomas Waldecker Software Engineering
Veröffentlichungsdatum

nix Flakes für die Entwicklung

Autoren
  • avatar
    Name
    Thomas Waldecker

Nix Flakes sind noch besser geeignet als nix-shell, aber auch etwas komplizierter.

Sie sind jetzt meine Lösung für Entwicklungsumgebungen.

nix-flake-stylistic

Es funktioniert sehr gut unter Windows in WSL und auch in MacOS.

Hier ist ein Beispiel-Flake für ein nodejs und yarn Projekt:

{
  description = "nix nodejs development flake";

  inputs.nixpkgs.url = "github:NixOS/nixpkgs";

  outputs = { self, nixpkgs }:
    let
      supportedSystems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
      forEachSupportedSystem = f: nixpkgs.lib.genAttrs supportedSystems (system: f {
        pkgs = import nixpkgs { inherit system; };
      });
    in
    {
      devShells = forEachSupportedSystem ({ pkgs }: {
        default = pkgs.mkShell {
          packages = with pkgs; [
            nodejs_22
            yarn-berry
          ];
        };
      });
    };
}

Man startet es mit

nix develop -c $SHELL

Damit bleibt man in seiner Shell (z.B. zsh) und hat von nun an die benötigten Tools verfügbar.

Es ist meiner Meinung nach aktuell die beste Methode um die benötigten Abhängigkeiten und Tools für verschiedene Projekte zu verwalten.

Hier noch einmal die High-Level Anforderungen:

  1. Effizienz Die Umgebung sollte schnell gestartet werden können, damit Entwickler effizient arbeiten können.
  2. Reproduzierbarkeit Die Umgebung sollte immer wieder identisch und reproduzierbar sein.
  3. Unabhängigkeit Die Umgebung sollte unabhängig von der Hardware oder Softwarekonfiguration des Hostsystems sein.
  4. Geschwindigkeit Die Abhängigkeiten sollten so schnell wie möglich geladen werden.

Vergleich zu Docker / Podman und Kubernetes (kind, Minikube):

  • Die Tools sind auch in der lokalen Shell verfügbar, z.B. TypeScript, was dann auch von VS Code benutzt werden kann.
  • Es läuft unter Windows mit WSL, nativem Linux und MacOS, man braucht nur den nix Paketmanager zu installieren.
  • Man hat ein einfaches Setup zur Entwicklung ohne gekapselte Container mit allen benötigten Tools, es ist eher vergleichbar damit die Tools lokal zu installieren (z.B. mit apt-get) jedoch ohne sein System mit Projektabhängigkeiten zu verändern.
  • Man kann mit nix auch z.b. podman und kind als Abhängigkeiten installieren um dann Container zu testen.
  • Es wird keine Container-Runtime standardmäßig auf dem Sytem installiert, welche immer im Hintergrund läuft.
  • Keine Lizenzkosten für Docker Desktop.

Falls Sie Ihre Entwicklungsumgebung auch vereinfachen wollen, oder eine Demo wünschen, kontaktieren Sie mich gerne.