Aller au contenu
Administration Linux medium

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

9 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 l’ancêtre de nix build. Il évalue une expression Nix, construit le résultat et crée un lien symbolique result :

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!
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. C’est l’ancêtre de nix shell et nix develop.

Fenêtre de terminal
nix-shell -p cowsay --run 'cowsay "nix-shell classique"'
Résultat
_____________________
< nix-shell classique >
---------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
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
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 l’ancêtre de nix profile. Il permet de chercher, installer, lister et supprimer des paquets dans le profil utilisateur.

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

nix-env présente plusieurs limites :

  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 nomnix-env -i htop peut installer un paquet inattendu si plusieurs correspondent.
  4. Pas de flake.lock — impossible de reproduire exactement le même environnement.
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.

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
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
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

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

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
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
  • 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é.

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn