Aller au contenu
Administration Linux medium

Commandes Nix classiques : nix-env, nix-build, nix-shell, nix-channel

14 min de lecture

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.

  • Identifier les commandes classiques et comprendre leur rôle
  • Utiliser nix-build et nix-shell (les deux plus utiles encore aujourd'hui)
  • Comprendre pourquoi nix-env est incompatible avec nix profile
  • Gérer les channels avec nix-channel et comprendre le passage aux flakes
  • Traduire chaque commande classique vers son équivalent moderne

Vous croiserez les commandes classiques dans plusieurs situations :

  • lire un tutoriel ou un README qui utilise nix-shell -p ou nix-build,
  • maintenir un projet qui utilise un shell.nix ou default.nix,
  • déboguer une installation sur une machine configurée avec les anciens channels,
  • migrer progressivement un workflow basé sur nix-env vers nix profile.

nix-build est le prédécesseur de nix build. Il évalue une expression Nix, construit le résultat et crée dans le répertoire courant un lien symbolique nommé result qui pointe vers le chemin du store. Ce lien sert aussi de racine de garbage collection : tant qu'il existe, le résultat ne sera pas supprimé par nix-collect-garbage.

Fenêtre de terminal
nix-build '<nixpkgs>' -A hello
Résultat
/nix/store/10s5j3mfdg22k1597x580qrhprnzcjwb-hello-2.12.3
Fenêtre de terminal
./result/bin/hello
Résultat
Hello, world!

Les deux commandes produisent la même dérivation, mais elles ne résolvent pas la source au même endroit et ne rendent pas le résultat de la même façon : nix-build affiche le chemin store sur la sortie standard, ce qui permet de le capturer dans un script, là où nix build se contente de créer le lien result.

Aspectnix-buildnix build
Syntaxe source'<nixpkgs>' -A hellonixpkgs#hello
RésolutionChannels (NIX_PATH)Registres flakes
SortieChemin store sur stdoutLien result (silencieux)
PinningManuel (pas de lock)flake.lock automatique

nix-shell crée un environnement shell temporaire dans lequel les paquets demandés sont présents dans le PATH, sans rien installer dans le profil. C'est le prédécesseur commun de nix shell et de nix develop, ce qui explique qu'une seule commande classique couvre aujourd'hui deux commandes modernes.

L'option -p construit un environnement jetable contenant les paquets nommés, et --run y exécute une commande puis rend la main au lieu d'ouvrir un shell interactif. Rien n'est installé dans le profil : à la sortie, seul le contenu téléchargé dans le store subsiste.

Fenêtre de terminal
nix-shell -p cowsay --run 'cowsay "nix-shell classique"'
Résultat
_____________________
< nix-shell classique >
---------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||

Plusieurs paquets se chaînent derrière un seul -p, séparés par des espaces et sans répéter l'option.

Fenêtre de terminal
nix-shell -p curl jq --run 'echo "curl et jq disponibles"'
Résultat
curl et jq disponibles

L'usage le plus courant de nix-shell est avec un fichier shell.nix à la racine d'un projet :

shell.nix
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = [
pkgs.python3
pkgs.curl
pkgs.jq
];
}
Fenêtre de terminal
nix-shell
# → shell interactif avec python3, curl et jq

nix-shell recouvre deux usages que les commandes modernes ont séparés en deux outils distincts. Le premier tableau compare l'usage jetable en ligne de commande, le second l'environnement de développement décrit par un fichier versionné avec le projet.

Aspectnix-shell -p pkgnix shell nixpkgs#pkg
RésolutionChannels (NIX_PATH)Registre flakes
EnvironnementAjoute stdenv completAjoute uniquement le paquet
Fichier projetshell.nixflake.nixdevShells
Aspectnix-shell (fichier)nix develop
Fichiershell.nixflake.nix
PinningManuelflake.lock automatique
ReproductibilitéDépend de NIX_PATHGarantie par le lock

nix-env est le prédécesseur de nix profile. Il permet de chercher, installer, lister et supprimer des paquets dans le profil utilisateur, c'est-à-dire l'ensemble de liens symboliques qui rend un programme disponible dans le PATH sans passer par un shell temporaire. C'est la seule commande classique dont la migration est bloquante : un profil créé par nix profile lui est définitivement fermé.

Ces options tiennent en une lettre et se combinent : -q interroge, -i installe, -e supprime, et -A désigne le paquet par son chemin d'attribut (nixpkgs.htop) plutôt que par son nom affiché.

Fenêtre de terminal
# Chercher un paquet
nix-env -qaP '.*htop.*'
# Installer
nix-env -iA nixpkgs.htop
# Lister les paquets installés
nix-env -q
# Supprimer
nix-env -e htop
# Mettre à jour tout
nix-env -u
# Rollback
nix-env --rollback
# Lister les générations
nix-env --list-generations

Sur un poste neuf, la question ne se pose pas vraiment : nix-env conserve un état global et non versionné, alors que tout l'intérêt de Nix tient à la reproductibilité. Les quatre limites ci-dessous se paient au moment où vous essayez de rejouer une installation sur une autre machine.

  1. Incompatible avec nix profile, les deux formats de profil sont mutuellement exclusifs.
  2. Pas de pinning, la version installée dépend de l'état du channel au moment de l'installation.
  3. Résolution par nom, nix-env -i htop peut installer un paquet inattendu si plusieurs correspondent.
  4. Pas de flake.lock, impossible de reproduire exactement le même environnement.

Chaque ligne se lit comme une traduction directe : la commande de gauche et celle de droite produisent le même effet fonctionnel. Elles ne s'appliquent simplement pas au même format de profil, donc la migration se fait en une fois, pas commande par commande.

nix-envnix profile
nix-env -qaP patternnix search nixpkgs pattern
nix-env -iA nixpkgs.pkgnix profile add nixpkgs#pkg
nix-env -qnix profile list
nix-env -e pkgnix profile remove pkg
nix-env -unix profile upgrade '.*'
nix-env --rollbacknix profile rollback
nix-env --list-generationsnix profile history

Les channels sont l'ancien mécanisme pour résoudre <nixpkgs> vers une version spécifique de l'arbre nixpkgs. La liste est stockée dans ~/.nix-channels pour un channel utilisateur, et sous /nix/var/nix/profiles pour un channel installé en root, ce qui explique que sudo nix-channel --list puisse afficher autre chose que la même commande sans sudo.

Un channel se déclare une fois, puis se rafraîchit à la demande : --update télécharge la nouvelle description de l'arbre nixpkgs et fait pointer <nixpkgs> dessus. Toutes les commandes classiques lancées ensuite résolvent donc des versions différentes, sans qu'aucun fichier de votre projet ne change.

Fenêtre de terminal
# Lister les channels configurés
nix-channel --list
# Ajouter un channel
nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs
# Mettre à jour
nix-channel --update

La différence tient en un point : un channel est un curseur mobile partagé par toute la machine, un flake fige la version dans un fichier flake.lock propre au projet. Deux collègues qui ont mis à jour leur channel à des dates différentes n'obtiendront pas les mêmes paquets ; avec un lock committé, ils obtiennent le même hash.

AspectChannelsFlakes
VerrouillageNon (rolling)Oui (flake.lock)
ReproductibilitéDépend du momentGarantie par le hash
ConfigurationGlobale (~/.nix-channels)Par projet (flake.nix)
Résolution<nixpkgs> via NIX_PATHnixpkgs via registre

Les trois commandes qui suivent n'ont pas d'urgence de migration : elles servent au diagnostic et au ménage du store, pas à la gestion quotidienne des paquets. Vous les croiserez surtout dans des scripts de maintenance et dans les réponses de forum consacrées à un /nix/store qui déborde.

nix-instantiate s'arrête à l'évaluation : il écrit le fichier .drv, la recette de construction, dans le store et affiche son chemin, sans compiler ni télécharger le paquet lui-même.

Fenêtre de terminal
nix-instantiate '<nixpkgs>' -A hello
Résultat
/nix/store/7mdg60drrnh0wq1j8hmmbhll47czm107-hello-2.12.3.drv

Équivalent moderne : nix derivation show nixpkgs#hello

Sans option, la commande ne supprime que les chemins du store qu'aucune racine ne référence encore. L'option -d va plus loin et détruit les anciennes générations des profils, ce qui rend le rollback impossible vers les versions concernées ; --delete-older-than 30d limite la casse à celles de plus de trente jours.

Fenêtre de terminal
# Supprimer les paquets non référencés
nix-collect-garbage
# Supprimer aussi les anciennes générations de plus de 30 jours
nix-collect-garbage -d --delete-older-than 30d

Équivalent moderne : nix profile wipe-history + nix store gc

nix-store -q interroge le graphe de dépendances dans les deux sens : --references liste ce dont un chemin dépend, --referrers liste ce qui dépend de lui. Ce second sens répond à la question qui bloque une suppression, quand le ramasse-miettes refuse de libérer un chemin encore utilisé.

Fenêtre de terminal
# Afficher les dépendances d'un chemin
nix-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 store
nix-store --verify --check-contents

Gardez ce tableau sous la main quand vous lisez un tutoriel ancien : il donne l'équivalent moderne de chaque commande classique. Attention, l'équivalence porte sur l'usage, pas sur la syntaxe des arguments, et surtout pas sur l'état : basculer de nix-env vers nix profile impose de réinstaller les paquets, les deux profils ne se lisent pas mutuellement.

ClassiqueModerneUsage
nix-env -qaPnix searchChercher
nix-env -iAnix profile addInstaller
nix-env -enix profile removeSupprimer
nix-env -unix profile upgradeMettre à jour
nix-env --rollbacknix profile rollbackRollback
nix-buildnix buildConstruire
nix-shell -pnix shellShell temporaire
nix-shell (fichier)nix developEnv. de développement
nix-channelRegistres flakesSources de paquets
nix-instantiatenix derivation showInspecter la dérivation
nix-collect-garbagenix store gcGarbage collection
nix-store -qnix path-infoInfo store

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  • nix-build et nix-shell restent fonctionnels et utiles pour les projets qui utilisent default.nix ou shell.nix.
  • nix-env et nix profile sont mutuellement incompatibles, si vous utilisez les commandes modernes, n'utilisez pas nix-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 -p importe le stdenv complet, ce qui est plus lourd que nix shell qui n'ajoute que le paquet demandé.
  • Les flakes : Découvrez les flakes pour des projets reproductibles et verrouillés.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn