Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.