Simple reproduzierbare Entwicklungsumgebungen mit Nix

Sebastian hatte in seinem Blogpost Python-Abhängigkeiten projektbezogen verwalten das Problem, bestimmte Shell-Tools reproduzierbar für alle Entwickler bereitstellen zu müssen. In seinem Fall ging es dabei nur um awscli und awsebcli, beides Python-Tools von PyPI. Das geht relativ angenehm über seine genannte Methode mit pip und virtualenv. Selbst mit der Einschränkung auf PyPI als Quelle für die Abhängigkeiten zeigen sich jedoch schon die Vorteile von Nix.

Eine einfache shell.nix

Um die beiden Tools auf der CLI ausführen zu können, genügt es zunächst, eine einfache shell.nix zu schreiben – vorausgesetzt Nix ist installiert:

Dabei werden durch Zeile 1 die Pakete vom System-nixpkgs, d.h. aus dem NIX_PATH, in den Scope geholt. Daraus wird in Zeile 3 eine Derivation mit dem notwendig anzugebendem Namen „test-project“ erstellt. In Zeile 6 werden letztendlich den gewünschten CLI-Tools angegeben. Angewendet sieht das dann folgendermaßen aus:

Hier ist schön zu sehen, dass im System die Kommandos aws und eb nicht vorhanden sind. Sobald aber die nix-shell ausgeführt wird, ist beides im PATH. Damit ist das erste Ziel erreicht: Die Tools können in einem Shell-Environment ausgeführt werden, müssen aber nicht im System installiert werden. Noch hängt das allerdings vom lokalen NIX_PATH und dem damit verbundenen Nix-Channel oder lokalem nixpkgs-Checkout ab.

Den vollständigen Code dazu findet ihr auf GitHub: mayflower/nix-shell-env-example/tree/step-1

Reproduzierbare Versionen

Es hat sich in der Nix-Community eine Option etabliert, reproduzierbar eine feste nixpkgs-Version zu importieren ohne den NIX_PATH zu benutzen. Seit Nix 2 kann dafür builtins.fetchTarball benutzt werden.

Mit dieser Änderung wird nixpkgs jetzt auf einen festen Commit gepinnt – in diesem Fall auf den Stand von 18.03-beta am 22. März 2018. Um den Hash zu bekommen, kann man mit einem falschen Hash folgendes ausführen:

Den vollständigen Code zu diesem Beispiel findet ihr im Step 2 auf GitHub: mayflower/nix-shell-env-example/tree/step-2

Zusätzlicher Tipp: shellHook

Oft werden noch zusätzliche Bootstrap-Schritte gebraucht, um das lokale Setup auf einem Stand zu haben auf dem entwickelt werden kann. Das kann ein yarn install sein, das Linken von Git-Hooks in .git oder das setzen eines Shell-Alias, wie im folgenden Beispiel. Der shellHook wird dabei einfach beim Öffnen der nix-shell ausgeführt.

Ausgeführt sieht das dann so aus:

Auch hier findet ihr den Code wieder auf GitHub: mayflower/nix-shell-env-example/tree/step-3

Für neue Blogupdates anmelden:


3 Gedanken zu “Simple reproduzierbare Entwicklungsumgebungen mit Nix

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.