Gestion de paquets fonctionnelle et reproductibilité système
Présentation
GNU Guix est un gestionnaire de paquets fonctionnel développé sous l’égide du projet GNU. Lancé en 2012, il s’inspire directement de Nix (Guile and Nix) mais prend ses propres directions, notamment en utilisant GNU Guile (Scheme) comme langage de configuration à la place d’un DSL maison (Nix).
Il s’utilise de deux façons : soit comme un gestionnaire de paquets sur une distribution Linux existente (Debian, Fedora, Arch, …), soit comme distribution complète (Guix System) où l’intégralité du système est géré par Guix.
Un modèle différent
Sur un système classique, les paquets s’installent dans des répertoires partagés standards : /usr/lib, /usr/bin, /usr/share, … Tout le monde écrit au même endroit, ce qui crée inévitablement des conflits quand deux paquets ont besoin de versions différentes d’une même dépendance.
Guix rompt avec ce modèle. Chaque paquet est installé dans un répertoire isolé sous /gnu/store/, identifié par un hash calculé à partir de l’ensenmble de ses inputs, dépendances, flags de compilation, variables d’environnement, …
/gnu/store/ck219pbqjb0vb4jp81rjbr5dr6p2g3vl-curl-8.4.0/
/gnu/store/0hijs4939as0k1q1jfz4jsxzm5lxwfrm-git-2.42.0/
La conséquence directe : deux paquets ne peuvent jamais entrer en fonclit, et les builds sont reproductibles au niveau binaire. Même inputs, même output.
Générations et rollback
Chaque modification de l’environnement (installation, supression, mise à jour). Crée une nouvelle génération. Les générations précédentes restent intactes et accessibles :
guix install ripgrep
# génération 4 créée
guix package --roll-back
# retour à la génération 3, immédiat
C’est un filet de sécurité que les gestionnaires de paquets classiques n’offrent pas. Une muse à jour qui casse quelque chose se corrige en une commande, sans bricolage (coucou Arch)
Des environnements isolés à la demande
guix shell permet de créer des environnements épémères sans toucher au système.
# Environnement avec Python et ses dépendances, isolé via namespaces Linux
guix shell --container python python-numpy python-pandas
Pas de Docker, pas de daemon, pas de droits root. L’isolation repose sur les namespaces Linux directement. En sortant du shell, l’environnement disparaît, le store reste propre.
C’est particulièrement utile pour tester un outil, travailler sur plusieurs projets avec des dépendances incompatibles, ou partager un environnement reproductible avec d’autres.
Reproductibilité dans le temps
Le dépôt de paquets de Guix est un dépôt Git. Chaque commit correspond à un était précis de la codebase de Guix. Vous pouvez y accrocher et rejouer un environnement identique des mois ou des années plus tard :
guix time-machine --commit=abc123def -- shell python python-scipy