Zum Hauptinhalt springen
Version: 1.89.x (Q2 26)

Abhängigkeiten mit Nix installieren

Grundlegende Verwendung

Um binäre Abhängigkeiten während der prepare- oder run-Phase der CI/CD-pipeline zu installieren, unterstützt Codesphere den Nix Package Manager. Nix wird gegenüber traditionellen Linux-Paketmanagern wie apt oder yum aus mehreren Gründen bevorzugt:

  • Nix benötigt keine Root-Rechte, um Pakete zu installieren, da es das Root-Dateisystem nicht verändert.
  • Nix erlaubt es, mehrere Versionen eines Pakets gleichzeitig installiert zu haben, was für Tests und Entwicklung nützlich ist.
  • Nix bietet eine deklarative Möglichkeit, Abhängigkeiten und deren Versionen anzugeben, was es ideal für CI/CD-pipelines macht, in denen Reproduzierbarkeit wichtig ist.
  • Nix verwendet Channels, um Paketversionen zu verwalten, sodass man leicht zwischen verschiedenen Versionen eines Pakets wechseln oder auf die neueste Version aktualisieren kann.

Nix bietet eine große Sammlung vorgefertigter Pakete unter search.nixos.org/packages.

Der einfachste Weg, ein Paket über Nix zu installieren, ist die Verwendung des Befehls nix-env.

nix-env -iA nixpkgs.<PACKAGE_NAME>

Um zum Beispiel das Tool cowsay in den Workspace zu installieren, sucht man nach cowsay in den Nix-Paketen und kopiert den nix-env-Befehl für Nicht-NixOS-Systeme, also

nix-env -iA nixpkgs.cowsay

Nix installiert Pakete in einem versionierten Pfad im Verzeichnis /nix/store, das vom Rest des Dateisystems isoliert ist. Bei der Installation eines Pakets wird ein Symlink zur ausführbaren Datei im /nix/store-Verzeichnis erstellt. In Codesphere wird der Nix Store automatisch zwischen allen Reactives geteilt. Werden also Nix-Pakete in der prepare-Phase installiert, stehen sie auch in der run-Phase jedes Services zur Verfügung, ohne dass sie erneut installiert werden müssen.

Mit der Option -q lassen sich installierte Pakete auflisten:

nix-env -q

Um ein bestimmtes Paket zu aktualisieren, verwendet man die Option -u:

nix-env -uA nixpkgs.cowsay

Um alle über Nix installierten Pakete zu aktualisieren, führt man einfach aus:

nix-env -u '*'

Falls erforderlich, können Pakete mit der Option -e entfernt werden:

nix-env -e cowsay

Nix-Dokumentation

Die vollständige Dokumentation zu nix-env findet sich im Nix Manual

Nix Channels und Paketversionen

Nix verwaltet die Version jedes Pakets über Nix Channels. Wird eine bestimmte Version eines Pakets benötigt, kann der Channel im nix-env-Befehl angegeben werden. Um zum Beispiel ein Paket aus dem Channel nixos-25.11 zu installieren, kann Folgendes ausgeführt werden:

nix-channel --add https://nixos.org/channels/nixos-25.11 nixos-25_11
nix-channel --update nixos-25_11

Anschließend kann das Paket aus diesem Channel installiert werden:

nix-env -iA nixos-25_11.<PACKAGE_NAME>

Mit folgenden Befehlen lässt sich überprüfen, welche Channels hinzugefügt wurden:

nix-channel --list

Nix Channels

Codesphere verwendet standardmäßig den Channel nixos-unstable, ein Rolling-Release, das häufig mit den neuesten Paketversionen aktualisiert wird. Für die meisten Anwendungsfälle ist dieser Channel geeignet, aber falls mehr Stabilität oder bestimmte Paketversionen benötigt werden, kann wie oben beschrieben zu einem anderen Channel gewechselt werden.

Entwicklungsumgebungen mit Nix Shells erstellen

Bei Verwendung von nix-env werden Abhängigkeiten „global" im Rahmen eines Codesphere Workspace installiert. Als besonderes Merkmal erlaubt Nix zudem, isolierte Umgebungen mithilfe des Befehls nix-shell zu erstellen. Bei Verwendung von Nix Shells sind die installierten Abhängigkeiten flüchtig und auf die Shell-Sitzung beschränkt, was eine bessere Reproduzierbarkeit und das Nebeneinanderbestehen unterschiedlicher Umgebungen ermöglicht.

Der einfachste Weg, eine Nix Shell zu erstellen, ist die Ausführung von nix-shell mit der Option -p, gefolgt von den Paketen, die in die Shell-Umgebung eingebunden werden sollen. Um zum Beispiel eine Nix Shell mit Python 3 und dem NumPy-Paket zu erstellen, kann Folgendes ausgeführt werden:

nix-shell -p python3 python3Packages.numpy

Für besser reproduzierbare Umgebungen kann eine shell.nix-Datei definiert werden. Diese Datei gibt die Abhängigkeiten und Umgebungsvariablen an, die für das Projekt benötigt werden. Um zum Beispiel eine Nix Shell mit denselben Paketen zu erstellen, kann eine shell.nix-Datei mit folgendem Inhalt angelegt werden:

# shell.nix
{ pkgs ? import (fetchTarball "https://channels.nixos.org/nixos-25.11/nixexprs.tar.xz") {} }:

pkgs.mkShell {
nativeBuildInputs = [
pkgs.python3
pkgs.python3Packages.numpy
];
}

Um die Nix Shell zu betreten, führt man folgenden Befehl im Verzeichnis mit der shell.nix-Datei aus:

nix-shell

Channels in Nix Shells festlegen (Pinning)

Der Befehl fetchTarball „pinnt" die Umgebung auf eine bestimmte Version aller Nix-Pakete, wodurch sichergestellt wird, dass der Build hochgradig reproduzierbar ist. Die URL kann auf einen bestimmten Commit auf GitHub oder eine Nix-Channel-URL auf nixos.org verweisen.

Alternativ kann <nixpkgs> verwendet werden, um auf den im System konfigurierten Channel zu verweisen, was portabler, aber weniger reproduzierbar ist:

# shell.nix
{ pkgs ? import <nixpkgs> {} }:

pkgs.mkShell {
buildInputs = [ pkgs.python3 ];
}

Die Nix-Sprache erlaubt es, komplexe Umgebungen mit mehreren Abhängigkeiten und benutzerdefinierten Konfigurationen zu definieren, was über den Rahmen dieser Einführung hinausgeht. Weitere Informationen zum Erstellen und Anpassen von Nix Shells finden sich im Nix Manual.

Nix Shells in CI/CD-pipelines

Man kann nix-shell in der CI/CD-pipeline aufrufen, indem man die Option --run verwendet, um einen Befehl innerhalb der Shell-Umgebung auszuführen. Zum Beispiel:

nix-shell --run "python3 my_script.py"

Dadurch wird my_script.py mit den in der shell.nix-Datei definierten Abhängigkeiten ausgeführt, die in der Umgebung verfügbar sind.

Verwendung nativer Linux-Paketmanager

Obwohl der Nix-Ansatz eine große Zahl beliebter Pakete abdeckt, ist es in manchen Fällen nicht möglich, Abhängigkeiten mit Nix zu installieren. Ein Grund dafür könnte sein, dass der Maintainer eines Pakets apt-Repositories anbietet, aber den Quellcode nicht veröffentlicht, sodass das Nix-Projekt sie nicht neu bauen kann.

In Codesphere Private Cloud-Installationen können weiterhin native Linux-Paketmanager wie apt verwendet werden, indem benutzerdefinierte Basis-Images mit den benötigten Paketen erstellt werden, ohne sie auf Workspace-Ebene zu installieren. Weitere Details finden sich im Install Guide.