Les commandes nix-env, nix-build, nix-shell et nix-channel
constituent l’interface historique de Nix. Elles sont progressivement remplacées
par les commandes modernes
(nix search, nix shell, nix run, nix profile…), mais vous les
rencontrerez encore dans de nombreux tutoriels, wikis et scripts existants. Ce
guide les présente avec leur équivalent moderne pour vous permettre de lire et
adapter le code legacy.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Identifier les commandes classiques et comprendre leur rôle
- Utiliser
nix-buildetnix-shell(les deux plus utiles encore aujourd’hui) - Comprendre pourquoi
nix-envest incompatible avecnix profile - Gérer les channels avec
nix-channelet comprendre le passage aux flakes - Traduire chaque commande classique vers son équivalent moderne
Dans quel contexte ?
Section intitulée « Dans quel contexte ? »Vous croiserez les commandes classiques dans plusieurs situations :
- lire un tutoriel ou un README qui utilise
nix-shell -pounix-build, - maintenir un projet qui utilise un
shell.nixoudefault.nix, - déboguer une installation sur une machine configurée avec les anciens channels,
- migrer progressivement un workflow basé sur
nix-envversnix profile.
nix-build — construire un paquet
Section intitulée « nix-build — construire un paquet »nix-build est l’ancêtre de nix build. Il évalue une expression Nix,
construit le résultat et crée un lien symbolique result :
nix-build '<nixpkgs>' -A hello/nix/store/10s5j3mfdg22k1597x580qrhprnzcjwb-hello-2.12.3./result/bin/helloHello, world!Différences avec nix build
Section intitulée « Différences avec nix build »| Aspect | nix-build | nix build |
|---|---|---|
| Syntaxe source | '<nixpkgs>' -A hello | nixpkgs#hello |
| Résolution | Channels (NIX_PATH) | Registres flakes |
| Sortie | Chemin store sur stdout | Lien result (silencieux) |
| Pinning | Manuel (pas de lock) | flake.lock automatique |
nix-shell — un shell avec des dépendances
Section intitulée « nix-shell — un shell avec des dépendances »nix-shell crée un environnement shell temporaire. C’est l’ancêtre de
nix shell et nix develop.
Utilisation rapide avec -p
Section intitulée « Utilisation rapide avec -p »nix-shell -p cowsay --run 'cowsay "nix-shell classique"' _____________________< nix-shell classique > --------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||Combiner plusieurs paquets
Section intitulée « Combiner plusieurs paquets »nix-shell -p curl jq --run 'echo "curl et jq disponibles"'curl et jq disponiblesAvec un fichier shell.nix
Section intitulée « Avec un fichier shell.nix »L’usage le plus courant de nix-shell est avec un fichier shell.nix à la
racine d’un projet :
{ pkgs ? import <nixpkgs> {} }:pkgs.mkShell { buildInputs = [ pkgs.python3 pkgs.curl pkgs.jq ];}nix-shell# → shell interactif avec python3, curl et jqDifférences avec les commandes modernes
Section intitulée « Différences avec les commandes modernes »| Aspect | nix-shell -p pkg | nix shell nixpkgs#pkg |
|---|---|---|
| Résolution | Channels (NIX_PATH) | Registre flakes |
| Environnement | Ajoute stdenv complet | Ajoute uniquement le paquet |
| Fichier projet | shell.nix | flake.nix → devShells |
| Aspect | nix-shell (fichier) | nix develop |
|---|---|---|
| Fichier | shell.nix | flake.nix |
| Pinning | Manuel | flake.lock automatique |
| Reproductibilité | Dépend de NIX_PATH | Garantie par le lock |
nix-env — gérer les paquets du profil
Section intitulée « nix-env — gérer les paquets du profil »nix-env est l’ancêtre de nix profile. Il permet de chercher, installer,
lister et supprimer des paquets dans le profil utilisateur.
Commandes principales
Section intitulée « Commandes principales »# Chercher un paquetnix-env -qaP '.*htop.*'
# Installernix-env -iA nixpkgs.htop
# Lister les paquets installésnix-env -q
# Supprimernix-env -e htop
# Mettre à jour toutnix-env -u
# Rollbacknix-env --rollback
# Lister les générationsnix-env --list-generationsPourquoi éviter nix-env
Section intitulée « Pourquoi éviter nix-env »nix-env présente plusieurs limites :
- Incompatible avec
nix profile— les deux formats de profil sont mutuellement exclusifs. - Pas de pinning — la version installée dépend de l’état du channel au moment de l’installation.
- Résolution par nom —
nix-env -i htoppeut installer un paquet inattendu si plusieurs correspondent. - Pas de flake.lock — impossible de reproduire exactement le même environnement.
Table de correspondance
Section intitulée « Table de correspondance »nix-env | nix profile |
|---|---|
nix-env -qaP pattern | nix search nixpkgs pattern |
nix-env -iA nixpkgs.pkg | nix profile add nixpkgs#pkg |
nix-env -q | nix profile list |
nix-env -e pkg | nix profile remove pkg |
nix-env -u | nix profile upgrade '.*' |
nix-env --rollback | nix profile rollback |
nix-env --list-generations | nix profile history |
nix-channel — gérer les sources de paquets
Section intitulée « nix-channel — gérer les sources de paquets »Les channels sont l’ancien mécanisme pour résoudre <nixpkgs> vers une
version spécifique de l’arbre nixpkgs.
Commandes principales
Section intitulée « Commandes principales »# Lister les channels configurésnix-channel --list
# Ajouter un channelnix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs
# Mettre à journix-channel --updateChannels vs flakes
Section intitulée « Channels vs flakes »| Aspect | Channels | Flakes |
|---|---|---|
| Verrouillage | Non (rolling) | Oui (flake.lock) |
| Reproductibilité | Dépend du moment | Garantie par le hash |
| Configuration | Globale (~/.nix-channels) | Par projet (flake.nix) |
| Résolution | <nixpkgs> via NIX_PATH | nixpkgs via registre |
Autres commandes classiques
Section intitulée « Autres commandes classiques »nix-instantiate — évaluer une dérivation
Section intitulée « nix-instantiate — évaluer une dérivation »nix-instantiate '<nixpkgs>' -A hello/nix/store/7mdg60drrnh0wq1j8hmmbhll47czm107-hello-2.12.3.drvÉquivalent moderne : nix derivation show nixpkgs#hello
nix-collect-garbage — libérer de l’espace
Section intitulée « nix-collect-garbage — libérer de l’espace »# Supprimer les paquets non référencésnix-collect-garbage
# Supprimer aussi les anciennes générations de plus de 30 joursnix-collect-garbage -d --delete-older-than 30dÉquivalent moderne : nix profile wipe-history + nix store gc
nix-store — opérations sur le store
Section intitulée « nix-store — opérations sur le store »# Afficher les dépendances d'un cheminnix-store -q --references /nix/store/922c...-ripgrep-15.1.0
# Afficher les référents (qui dépend de ce chemin)nix-store -q --referrers /nix/store/922c...-ripgrep-15.1.0
# Vérifier l'intégrité du storenix-store --verify --check-contentsTable de correspondance complète
Section intitulée « Table de correspondance complète »| Classique | Moderne | Usage |
|---|---|---|
nix-env -qaP | nix search | Chercher |
nix-env -iA | nix profile add | Installer |
nix-env -e | nix profile remove | Supprimer |
nix-env -u | nix profile upgrade | Mettre à jour |
nix-env --rollback | nix profile rollback | Rollback |
nix-build | nix build | Construire |
nix-shell -p | nix shell | Shell temporaire |
nix-shell (fichier) | nix develop | Env. de développement |
nix-channel | Registres flakes | Sources de paquets |
nix-instantiate | nix derivation show | Inspecter la dérivation |
nix-collect-garbage | nix store gc | Garbage collection |
nix-store -q | nix path-info | Info store |
À retenir
Section intitulée « À retenir »nix-buildetnix-shellrestent fonctionnels et utiles pour les projets qui utilisentdefault.nixoushell.nix.nix-envetnix profilesont mutuellement incompatibles — si vous utilisez les commandes modernes, n’utilisez pasnix-env.- Les channels sont remplacés par les registres flakes qui offrent un verrouillage automatique via
flake.lock. - Pour un nouveau projet, préférez les commandes modernes et les flakes — les commandes classiques sont utiles principalement pour comprendre le code legacy.
nix-shell -pimporte le stdenv complet, ce qui est plus lourd quenix shellqui n’ajoute que le paquet demandé.