Nix
Quand on crée des programmes, surtout dans le monde de la recherche, on désire la reproductibilité. Une autre personne doit pouvoir exécuter votre programme dans les même conditions.
Malheureusement, en C, les librairies sont installés au niveau du système. Deux ordinateurs n’ont pas forcément les même versions. Malheureusement, en Python, avec les environnements virtuels et pip, on s’approche de la reproductibilité car on peut spécifier les versions des packages Python. Mais, on dépend toujours des librairies du système et de la version actuelle de Python sur le système.
Nix est un outil qui permet de :
- spécifier une installation complète (version de Python, version C++, versions des packages Python, des librairies C++, etc.)
- gérer un environnement avec plusieurs langages
- lancer rapidement un programme sans penser à son installation
Installation de Nix
https://zero-to-nix.com/start/install/
Construire un environnement ligne de commande personnalisé
https://nix.dev/tutorials/first-steps/declarative-shell
Fichier de configuration
Crée un fichier shell.nix contenant :
let
nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-24.05";
pkgs = import nixpkgs { config = {}; overlays = []; };
in
pkgs.mkShellNoCC {
packages = with pkgs; [
cowsay
lolcat
(python311.withPackages (ps:[ps.numpy ps.pillow]))
];
env.GREETING = "Hello, Nix!";
shellHook = ''
echo $GREETING | cowsay | lolcat
'';
}
La commande mkShellNoCC crée un shell sans “compilateur for C” (pas de gcc, glib etc.). shellHook contient le script d’initialisation. La construction (ps:[ps.numpy ps.pillow])) est une lambda-expression qui associe au dictionnaire de tous les packages Python ps associe la liste [ps.numpy ps.pillow].
On peut remplacer la commande par :
let nixpkgs =
fetchTarball {url = "https://github.com/NixOS/nixpkgs/tarball/nixos-25.05";
sha256 = "0kal9wdvh0f9kcgh0ya1dpiir9331ykmkvsdh6a37lq77ln6m3vm";};
Lancer un shell personnalisé
En tapant
nix-shell
on a un shell personnalisé.
Admirer ce shell
La commande type permet de savoir ce que sont les commandes. En tapant :
type git
dans l’environnement et en dehors, on voit que ce n’est pas le même exécutable ! Le git du système est dans le système
git is /usr/bin/git
alors que le git dans l’environnement est le nix-store, sorte de magasin de packages nix qui sont sur votre ordinateur :
git is /nix/store/0vbjxlqj8zp0pdjl2szvg17a98vqwyqj-git-2.51.0/bin/git
Pour quitter l’environnement, on tape exit.
Nettoyage
La commande suivante supprime des packages nix non utilisés :
nix-collect-garbage
Exécuter un projet existant
Pour lancer un programme disponible à une URL donnée (et donc l’installer aussi avec les bonnes librairies etc.) :
nix run URL
https://zero-to-nix.com/start/nix-run/
Entrer dans un environnement ligne de commande
Pour entrer dans une ligne de commande avec toutes les bonnes librairies d’installées :
nix develop URL
https://zero-to-nix.com/start/nix-develop/
Pour quitter l’environnement, on tape exit.
La commande type permet de savoir ce que sont les commandes. En tapant :
type git
dans l’environnement et en dehors, on voit que ce n’est pas le même exécutable ! Le git du système est dans le système
git is /usr/bin/git
alors que le git dans l’environnement est le nix-store, sorte de magasin de packages nix qui sont sur votre ordinateur :
git is /nix/store/0vbjxlqj8zp0pdjl2szvg17a98vqwyqj-git-2.51.0/bin/git
Guix
- Créer un fichier
manifest.scm - guix shell ghc
- une version de guix vient avec un channel donné. On le spécifie dans
channels.scm.