Der Nix Package Manager ist ein leistungsfähiges Werkzeug zur Verwaltung von Paketen auf Unix-ähnlichen Betriebssystemen. Mit Nix können User Software auf eine vorhersehbare, reproduzierbare und zuverlässige Weise installieren. Er unterscheidet sich von traditionellen Paketmanagern wie apt-get, yum und pacman dadurch, dass er die Koexistenz mehrerer Softwareversionen auf demselben System ohne Konflikte ermöglicht.
Wie Nix funktioniert
Nix funktioniert durch die Installation von Paketen in den Nix-Speicher, der sich normalerweise unter /nix/store befindet. Jedes Paket im Store hat einen eindeutigen Pfad, der seinen Namen, seine Version und einen Hash der Abhängigkeiten enthält:
- Atomare Upgrades und Rollbacks: Änderungen am System werden atomar durchgeführt. Wenn die Installation eines Pakets fehlschlägt, bleibt das System in seinem vorherigen Zustand. Außerdem können Sie bei Bedarf zu einer früheren Konfiguration zurückkehren.
- Mehrere Versionen: Verschiedene Anwendungen können verschiedene Versionen desselben Pakets verwenden, ohne dass es zu Konflikten kommt.
- Reproduzierbare Umgebung: Bei einem Nix-Ausdruck baut Nix immer die gleiche Umgebung, unabhängig vom aktuellen Zustand des Systems.
Darüber hinaus macht Nix nach der Installation eines Pakets dessen Befehle automatisch vom Terminal aus verfügbar, indem es den Installationsort zur Umgebungsvariablen PATH hinzufügt. Das bedeutet, dass Sie die Befehle, die das Paket bereitstellt, sofort nach der Installation verwenden können, genau wie Sie es von anderen Paketmanagern gewohnt sind.
Nix verwenden
Nix wird mit Codesphere vorinstalliert. Sie können Pakete mit dem Befehl nix-env installieren. Um zum Beispiel hello zu installieren, ein Programm, das eine freundliche Begrüßung erzeugt, führen Sie (gemäß den Anweisungen des Pakets) aus:
nix-env -iA nixpkgs.hello
Sie können Pakete mit der Option -e entfernen:
nix-env -e hello
Und Sie können Pakete mit der Option -u aktualisieren:
nix-env -uA nixpkgs.hello
Eine Liste der verfügbaren Nix-Pakete mit Installationsanweisungen finden Sie auf deren Suche: https://search.nixos.org/packages
Paketnamen und -versionen in Nix
Bitte beachten Sie, dass sich die Paketnamen in Nix von denen in anderen Paketmanagern wie apt-get unterscheiden können. Die genauen Namen und Versionen der in Nix verfügbaren Pakete können Sie im Nix-Paketindex auf der genannten NixOS-Website einsehen.
Einige Pakete in Nix können anders benannt sein oder andere Versionen haben als in anderen Paketmanagern, da die Nix-Community die Pakete unabhängig voneinander pflegt.
Projektspezifische Umgebungen mit Nix erstellen
Im Gegensatz zu traditionellen Paketmanagern, die Entwicklungswerkzeuge und Bibliotheken systemweit installieren, ermöglicht Nix die Erstellung von projektspezifischen Umgebungen mit den erforderlichen Werkzeugen und Bibliotheken. Dies kann mit dem Befehl nix-shell erreicht werden.
Um eine projektspezifische Umgebung zu erstellen, müssen Sie in Ihrem Projektverzeichnis eine Datei shell.nix erstellen, in der die erforderlichen Abhängigkeiten aufgeführt sind. Hier ist ein einfaches Beispiel:
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = [ pkgs.python3 pkgs.python3Packages.numpy ];
}
Sie können dann nix-shell in Ihrem Projektverzeichnis ausführen, um eine Shell mit Python und NumPy bereitzustellen. In dieser Umgebung können Sie sicher sein, dass Sie die richtigen Versionen Ihrer Abhängigkeiten haben, unabhängig vom Zustand des restlichen Systems.
Sie können dies auch in unseren CI-Pipelines mit einer Syntax ähnlich der folgenden verwenden: nix-shell --run "your command".
Erstellen Sie Ihre eigenen Pakete
Sie können auch .nix-Dateien verwenden, um Ihre eigenen Pakete zu erstellen oder sogar Dinge mit anderen Paketmanagern zu installieren, die selbst ein Nix-Paket sind.
Sie können dies zum Beispiel nutzen, um Java-Quarkus zu installieren, indem Sie die folgende shell.nix-Datei hinzufügen:
{pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
packages = with pkgs; [ jbang ];
shellHook = ''
echo ">>>> Making sure quarkus is installed"
jbang trust add https://repo1.maven.org/maven2/io/quarkus/quarkus-cli/
jbang app install --fresh --force quarkus@quarkusio
echo ">>>> Updating PATH"
export PATH=~/.jbang/bin/:$PATH
echo ">>>> You can start the debug mode via 'quarkus dev' (this project was created via 'quarkus create')."
'';
}
Auffinden von Legacy-Paketen
Manchmal kann es schwierig sein, Paketversionen für ältere Legacy-Versionen einiger Frameworks wie php zu finden, weil sie nicht im Nix-Kernrepository gepflegt werden. Wir fanden diese von der Gemeinschaft verwaltete Suchmaschine in diesen Fällen sehr hilfreich: https://lazamar.co.uk/nix-versions/?channel=nixpkgs-unstable&package=
Seien Sie vorsichtig, manche Pakete werden besser gewartet als andere.
Umstellung von apt-get auf Nix
Wenn Sie es gewohnt sind, apt-get oder einen anderen traditionellen Paketmanager zu benutzen, gibt es ein paar wichtige Unterschiede, die Sie beim Wechsel zu Nix beachten sollten.
- Installationsort: Wie bereits erwähnt, installiert Nix die Pakete in den Nix-Speicher und nicht in gewöhnliche Verzeichnisse wie /usr/bin.
- Root-Rechte: Sie brauchen kein sudo, um Pakete mit Nix zu installieren. Das liegt daran, dass Nix Pakete in den Nix-Speicher Ihres Users installiert, nicht systemweit.
- Mehrere Versionen: Nix erlaubt es Ihnen, mehrere Versionen eines Pakets gleichzeitig zu installieren. Dies unterscheidet sich von apt-get, mit dem nur eine Version gleichzeitig installiert werden kann.
- Systemkonfiguration: Nix geht über die Paketverwaltung hinaus und kann Ihre Systemkonfiguration verwalten. Dies ist eine fortgeschrittene Funktion, die den Rahmen dieser Einführung sprengen würde.
Abhilfe für NX Die folgenden Projekte sind an mehreren Standorten definiert:
Es scheint, dass einige Frameworks wie NX sich über Pakete beschweren, die über Nix in unserem .codesphere-internal-Ordner installiert wurden, der in jedem Workspace existiert.
Dies scheint ein Fehler auf ihrer Seite zu sein. https://github.com/nrwl/nx/issues/20959#issue-2060897714 Es gibt eine einfache Lösung, indem Sie .codesphere-internal/* in Ihre .nxignore oder alternativ .gitignore Datei einfügen.