Aller au contenu
English
Compte : non connecté, synchronisation possible Mon apprentissage
Selectionner le thème
English

Nix : comprendre l'écosystème et savoir quand l'utiliser

Par mis à jour le

Améliorer cette page

Vous avez déjà cassé un environnement en mettant à jour un paquet, ou passé des heures à reproduire la configuration d'un collègue ? Nix est un gestionnaire de paquets qui élimine ces problèmes à la racine. Chaque paquet est isolé, versionné et reproductible : deux machines configurées de la même façon obtiennent les mêmes paquets, au même chemin.

Ce guide pose les bases : vous comprendrez ce que Nix apporte par rapport aux gestionnaires classiques, comment les différentes briques de l'écosystème s'articulent, et dans quels cas concrets l'adopter.

  • Positionner Nix dans le paysage des gestionnaires de paquets Linux
  • Identifier les trois facettes de Nix : gestionnaire, langage et philosophie
  • Comprendre les concepts clés : store, hash, profils, générations
  • Comparer Nix à apt, dnf, Homebrew, asdf, mise et Docker
  • Décider quand adopter Nix, et quand ce n'est pas le bon choix

Nix répond à des problèmes que tout administrateur ou développeur rencontre tôt ou tard :

  • Vous administrez des serveurs et une mise à jour de bibliothèque casse un service en production, impossible de revenir en arrière avec apt.
  • Votre équipe partage un projet, mais chacun a des versions différentes de Python, Node.js ou Terraform, le fameux « ça marche sur ma machine ».
  • Vous testez un outil pour 5 minutes et vous ne voulez pas l'installer définitivement sur votre système.
  • Vous préparez un pipeline CI/CD et vous avez besoin d'un environnement identique entre votre poste, le serveur de build et la production.
  • Vous gérez plusieurs projets qui dépendent de versions incompatibles d'une même bibliothèque (le dependency hell).

Si l'un de ces scénarios vous parle, Nix a probablement quelque chose à vous apporter.

Le problème : des systèmes fragiles et non reproductibles

Section intitulée « Le problème : des systèmes fragiles et non reproductibles »

Les gestionnaires de paquets traditionnels, apt, dnf, pacman, partagent un même modèle : les paquets s'installent dans des répertoires communs (/usr/bin, /usr/lib). Ce modèle présente trois faiblesses structurelles.

Les conflits de dépendances. Quand deux logiciels ont besoin de versions différentes d'une même bibliothèque, le système ne peut en garder qu'une seule. L'installation de l'un casse l'autre.

L'absence de retour arrière fiable. apt upgrade modifie des fichiers en place. Si la mise à jour casse quelque chose, il n'y a pas de bouton "annuler" qui restaure l'état précédent.

La non-reproductibilité. Deux machines installées "à peu près pareil" divergent au fil du temps : mises à jour faites à des dates différentes, paquets ajoutés manuellement, PPA ou dépôts tiers... L'état final est imprévisible.

La réponse de Nix : isolation, immutabilité, reproductibilité

Section intitulée « La réponse de Nix : isolation, immutabilité, reproductibilité »

Nix adopte une architecture radicalement différente. Chaque paquet est stocké dans son propre répertoire, identifié par un hash unique :

/nix/store/aaaa1111...-python-3.12.0/
/nix/store/bbbb2222...-python-3.10.0/
/nix/store/cccc3333...-openssl-3.0.0/
/nix/store/dddd4444...-openssl-1.1.1/

Deux versions de Python coexistent sans conflit. Chaque paquet désigne ses dépendances exactes par leur chemin dans le store : deux paquets qui utilisent la même version d'OpenSSL partagent le même répertoire, deux paquets qui en veulent des versions différentes pointent chacun vers la sienne. Aucun fichier n'est modifié en place, donc rien ne peut être écrasé par une mise à jour.

C'est la première facette de Nix et la plus immédiatement utile. Nix peut s'installer sur n'importe quelle distribution Linux et sur macOS, en coexistant avec le gestionnaire de paquets natif.

Le tableau ci-dessous oppose Nix aux gestionnaires classiques sur les points où la différence se ressent au quotidien. Les deux lignes qui changent vraiment la donne sont la coexistence de versions et le retour arrière : ce sont elles qui expliquent pourquoi une équipe adopte Nix malgré sa courbe d'apprentissage.

Fonctionnalitéapt / dnfNix
Coexistence de versionsNon, une seule version par paquetOui, autant de versions que nécessaire
Retour arrièrePas de mécanisme natifRollback instantané par génération
Installation temporaireNonOui, nix shell charge un outil sans l'installer
ReproductibilitéDépend de la date et des dépôtsMêmes entrées, même chemin dans le store (hash)
Impact sur le systèmeModifie /usr/lib, /usr/binNe touche que /nix/store

Le dépôt nixpkgs (prononcé "nix-packages") est l'un des plus grands dépôts de logiciels au monde. Il contient plus de 100 000 paquets, régulièrement mis à jour par une communauté active.

La deuxième facette de Nix est moins visible mais fondamentale : Nix possède son propre langage de programmation fonctionnel qui sert à décrire comment construire et configurer les paquets.

Vous n'avez pas besoin de maîtriser le langage pour utiliser Nix au quotidien. Mais dès que vous voudrez créer vos propres environnements de développement ou comprendre comment un paquet est construit, le langage devient indispensable.

  • Décrire un environnement de développement dans un fichier shell.nix : Python 3.12 + requests + Flask + un linter, le tout reproductible.
  • Définir un paquet : ses sources, ses dépendances, ses options de compilation, dans une expression Nix.
  • Factoriser et modulariser : importer des fichiers, créer des fonctions réutilisables, composer des configurations.

Avec les gestionnaires classiques, vous donnez des instructions (paradigme impératif) :

Fenêtre de terminal
# Impératif : "fais ceci, puis ceci"
apt install python3
pip install requests flask

L'état final dépend de l'ordre des commandes, de ce qui était déjà installé, et de la date de la dernière mise à jour du système.

Avec Nix, vous décrivez l'état souhaité (paradigme déclaratif) :

# Déclaratif : "voici ce que je veux"
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
packages = [
pkgs.python312
pkgs.python312Packages.requests
pkgs.python312Packages.flask
];
}

Nix calcule comment atteindre cet état. Deux machines évaluant cette expression avec la même version de nixpkgs obtiennent le même environnement.

Au-delà du gestionnaire et du langage, Nix incarne une philosophie de gestion du logiciel fondée sur trois piliers.

Tout dans Nix est pensé pour être déterministe. Le hash de chaque paquet est calculé à partir de l'ensemble de ses entrées : code source, dépendances, options de compilation, compilateur.

Hash = f(sources + dépendances + options + compilateur)

Si les entrées sont identiques, le chemin dans le store est identique, et le résultat construit l'est dans l'immense majorité des cas, octet pour octet. C'est ce qui permet à deux machines indépendantes de produire le même environnement sans coordination, et au cache binaire de servir un paquet déjà construit au lieu de le recompiler.

Chaque paquet vit dans son propre répertoire sous /nix/store/. Il ne modifie aucun répertoire système comme /usr/lib, et ne voit que les dépendances qu'il référence explicitement. Cette isolation élimine les conflits de dépendances par conception.

Chaque opération crée une nouvelle génération (un instantané de votre profil). L'ancien état reste intact. Si quelque chose ne va pas, un rollback restaure l'état précédent en une commande. Il n'y a pas d'état intermédiaire corrompu.

Nix est le socle sur lequel s'appuient plusieurs projets complémentaires.

ProjetRôleRapport avec Nix
NixGestionnaire de paquets + langageLe noyau de l'écosystème
nixpkgsDépôt de 100 000+ paquetsLa bibliothèque de référence
NixOSDistribution Linux déclarativeSystème complet piloté par Nix
Home ManagerGestion déclarative des dotfilesConfigure le home avec Nix
FlakesSystème de dépendances + lock fileReproductibilité renforcée
CachixCache binaire partagéAccélère les builds en CI/CD

Nix (le gestionnaire de paquets) s'installe sur n'importe quelle distribution Linux ou macOS. Vous gardez votre système actuel, Debian, Ubuntu, Fedora, et vous ajoutez Nix par-dessus.

NixOS est une distribution Linux complète où tout le système est configuré par des expressions Nix : noyau, services, réseau, utilisateurs. C'est un engagement beaucoup plus fort.

Les flakes sont une évolution majeure de l'écosystème Nix. Ils ajoutent un fichier flake.lock qui fige les versions exactes de toutes les dépendances (comme package-lock.json en JavaScript ou Cargo.lock en Rust).

Concrètement, les flakes résolvent le problème des channels classiques : au lieu de dépendre d'une branche nixpkgs qui évolue dans le temps, vous référencez un commit précis, verrouillé dans le lock file.

Nous les couvrons en détail dans le guide Comprendre et utiliser les flakes.

C'est la comparaison la plus utile, car apt et dnf sont les gestionnaires que vous connaissez déjà. Retenez que Nix ne remplace pas forcément apt : il vise une portée plus large (langages et outils de dev, pas seulement les paquets système) et ajoute le rollback et le déclaratif, au prix d'une prise en main plus longue.

Critèreapt / dnfNix
PortéePaquets système uniquementSystème + langages + outils
VersionsUne seule version installableMultiples versions côte à côte
RollbackNonOui, par génération
DéclaratifNon (sauf Ansible/Puppet au-dessus)Nativement
Courbe d'apprentissageFaibleMoyenne à élevée

Homebrew est simple et populaire sur macOS. Nix est plus puissant mais plus complexe. Homebrew installe dans /opt/homebrew/ sur les Mac Apple Silicon, /usr/local/ sur les Mac Intel et /home/linuxbrew/.linuxbrew/ sous Linux, avec un modèle classique : une version par formule, sans isolation par hash ni rollback.

asdf et mise gèrent des versions d'outils de développement (Node.js, Python, Terraform...). Nix va plus loin : il gère aussi les bibliothèques système, les dépendances C, et permet de décrire des environnements complets.

Si vous avez juste besoin de basculer entre Node 22 et Node 24, asdf ou mise suffisent. Si vous avez besoin d'un environnement reproductible avec des dépendances système, Nix est le bon choix.

Docker isole au niveau du conteneur (processus, filesystem, réseau). Nix isole au niveau du paquet (dans le store). Les deux sont complémentaires :

  • Docker : isolation runtime, déploiement, orchestration
  • Nix : isolation de build, reproductibilité des dépendances, environnements de développement

Nix peut d'ailleurs construire des images Docker minimalistes sans avoir besoin de Docker pendant le build.

  • Vous gérez des environnements de développement partagés entre plusieurs personnes et vous voulez garantir qu'ils sont identiques.
  • Vous avez besoin de plusieurs versions d'un même outil côte à côte.
  • Vous voulez pouvoir revenir à un état précédent après une mise à jour qui casse quelque chose.
  • Vous construisez des pipelines CI/CD et vous avez besoin de reproductibilité.
  • Vous êtes curieux et prêt à investir du temps pour un outil durable.
  • Vous administrez un serveur simple avec apt et vous n'avez jamais eu de problème de reproductibilité.
  • Vous cherchez un outil "plug-and-play" sans courbe d'apprentissage.
  • Votre équipe n'a pas le temps d'apprendre un nouveau paradigme.
  • Vous n'utilisez que des conteneurs Docker pour isoler vos environnements et cela vous suffit.

L'écosystème Nix impose un vocabulaire propre, et c'est souvent lui qui rebute au début. Gardez ce tableau sous la main : les trois termes à ancrer en priorité sont le store (où tout est stocké), la génération (ce qui rend le rollback possible) et le flake (l'unité de projet qui fige les dépendances), les autres se comprennent une fois ceux-là acquis.

TermeDéfinition
StoreLe répertoire /nix/store/ où Nix stocke tous les paquets, chacun dans un dossier identifié par un hash unique
HashEmpreinte calculée à partir des sources et dépendances, garantit l'unicité et la reproductibilité
ProfilEnsemble de liens symboliques pointant vers les paquets que vous utilisez, c'est votre "vue" sur le store
GénérationInstantané numéroté de votre profil après chaque modification, permet le rollback
ChannelBranche du dépôt nixpkgs (méthode classique de gestion des sources de paquets)
NixpkgsLe dépôt communautaire principal, contenant plus de 100 000 définitions de paquets
FlakeUnité de projet Nix avec un flake.lock qui fige les dépendances (remplace progressivement les channels)
DérivationLa recette de construction d'un paquet dans le langage Nix
NixOSDistribution Linux complète où le système entier est configuré par des expressions Nix
Home ManagerOutil qui gère la configuration utilisateur (dotfiles, shell, applications) de façon déclarative via Nix
  • Nix est trois choses : un gestionnaire de paquets, un langage fonctionnel, et une philosophie basée sur la reproductibilité.
  • Chaque paquet est isolé dans /nix/store/ avec un hash unique, pas de conflit de dépendances possible.
  • Le rollback est natif : chaque modification crée une génération, et on peut revenir en arrière instantanément.
  • Nix coexiste avec votre distribution : il s'installe sur Debian, Ubuntu, Fedora ou macOS sans rien casser.
  • nixpkgs contient plus de 100 000 paquets et constitue l'un des plus grands dépôts logiciels au monde.
  • La courbe d'apprentissage est réelle : comptez quelques jours pour être à l'aise, quelques semaines pour le langage et les flakes.

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

Ce projet vous est utile ?

Les guides, formations, quiz et labs restent gratuits. Si vous les utilisez régulièrement, vous pouvez contribuer à leur maintenance et à leur développement.

Devenir membre de soutien (nouvel onglet) Soutenir une fois (nouvel onglet) En savoir plus

Suivez aussi le projet sur LinkedIn