Rien est un gestionnaire de packages fonctionnel pour Linux et d’autres systèmes Unix, rendant la gestion des packages plus fiable et facile à reproduire.

Avec un gestionnaire de packages traditionnel, lors de la mise à jour d’un package, une nouvelle version est téléchargée et utilisée pour écraser ses fichiers associés. Les modifications ne peuvent pas être annulées. Si pour une raison quelconque, un ou plusieurs fichiers ne sont pas correctement mis à jour lors de la mise à jour, ces fichiers du package vont être corrompus. Cela pourrait rendre l’ensemble du package non fonctionnel. De plus, si différents packages nécessitent différentes versions du même package en tant que dépendance, au moins un sera cassé.

Cet article présente ce qu’est le gestionnaire de packages Nix, les différentes options de déploiement et comment démarrer avec. Dans l’article suivant, nous couvrons les installation de NixOSune distribution Linux basée sur Nix.

C’est quoi Nix

Nix est un gestionnaire de packages fonctionnel. Vous trouverez ci-dessous les trois principaux avantages de l’utilisation de Nix par rapport à un gestionnaire de packages traditionnel :

  • Nix apporte fiabilité: l’installation ou la mise à niveau d’un paquet ne casse pas les autres paquets. Il garantit qu’aucun package n’est incohérent lors d’une mise à niveau. Il est possible de revenir aux versions précédentes.
  • Nix apporte reproductibilité: les packages sont construits par Nix indépendamment les uns des autres. Cela garantit qu’ils sont reproductibles et n’ont pas de dépendances non déclarées, donc si un paquet fonctionne sur une machine, il fonctionne sur une autre.
  • Nix est déclaratif: Nix facilite le partage des environnements de développement et de construction pour les projets, quels que soient les langages de programmation et les outils utilisés.

Avec Nix, les fichiers sont liés par des liens symboliques. Lorsqu’un paquet est installé, les liens symboliques pointent vers un emplacement à l’intérieur du Nix magasin répertoire, situé dans /nix/store. Lors de la mise à jour d’un package, les nouveaux fichiers de package sont extraits à un emplacement différent (pas d’écrasement), les liens symboliques pointent alors vers l’emplacement des nouveaux fichiers.

L’utilisation de liens symboliques pour faire référence à des packages présente certains avantages :

  • Aucun risque de corruption entre dépendances : plusieurs versions d’une même dépendance peuvent être installées
  • Moins d’exigence de stockage : la même version d’une dépendance n’est pas dupliquée

Le processus de mise à niveau d’un paquet crée ce que Nix appelle un génération. Il est possible de revenir en arrière et d’avancer dans les générations précédentes. Cela laisse le système entièrement fonctionnel car on peut toujours revenir à une génération précédente. Il est possible de sauvegarder et de conserver autant de générations que l’on veut. L’inconvénient est l’espace disque utilisé pour stocker les générations, mais il est possible de nettoyer les anciennes générations.

Nix déploiement

Nix peut être déployé sur un système d’exploitation existant, Linux ou macOS, ou en utilisant NixOS qui l’utilise à partir de zéro pour créer un système Linux.

Déploiement via NixOS

NixOS est une distribution Linux construite sur Nix. La installation de NixOS partager les étapes d’une distribution Linux alternative : partitionnement et formatage du disque avant installation du système d’exploitation. La documents officiels donne les étapes à suivre pour déployer Nix via l’installation de NixOS.

Déploiement sur un système d’exploitation existant

Nix est pris en charge sur Linux (i686, x86_64, aarch64) et mac OS (x86_64, aarch64). Voici les commandes pour installer Nix :

  • Linux
  • Mac OS :
    sh <(curl -L https://nixos.org/nix/install)

Suivre la Documents officiels pour en savoir plus sur l’installation sur un système d’exploitation existant.

Utilisation de Nix

Environnement utilisateur

UN Environnement utilisateur est un ensemble d’applications actives. Différents utilisateurs peuvent avoir différents environnements et des utilisateurs individuels peuvent basculer entre différents environnements. ~/.nix-profile est un lien symbolique vers l’environnement utilisateur actuel.

La gestion d’un environnement utilisateur se fait soit via une configuration déclarative à l’aide de Gestionnaire d’accueil ou via des opérations impératives utilisant nix-env commandes.

Gestionnaire d’accueil

Gestionnaire d’accueil est le meilleur moyen de gérer les environnements utilisateur. Il permet la configuration déclarative de packages et de fichiers spécifiques à l’utilisateur dans le répertoire personnel. Il s’installe via les commandes :

nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager

nix-channel --update
nix-shell '<home-manager>' -A install
home-manager edit

La commande home-manager edit installe Home Manager, initialise et expose le fichier de configuration de Home Manager situé à .config/nixpkgs/home.nix.

Chaque fois que quelque chose change dans le fichier de configuration de Home Manager, la commande ci-dessous crée et active la configuration pour l’utilisateur.

Vous trouverez ci-dessous une version modifiée du fichier home.nix pour installer le package firefox et de configurer git.

 config, pkgs, ... :


  
  
  home.username = "florent";
  home.homeDirectory = "/home/florent";

  
  home.packages = [
    
    pkgs.firefox
  ];

  
  programs.git = 
    enable = true;
    userName = "Florent";
    userEmail = "[email protected]";
  ;

  
  
  
  
  
  
  
  
  home.stateVersion = "22.05";

  
  programs.home-manager.enable = true;

Notez que les méthodes d’installation alternatives intègrent Home Manager à la configuration NixOS et nix-darwin. C’est ainsi que nous déployons nos systèmes. Suivre la documents officiels pour plus de détails.

Nix opérations impératives : nix-env

L’environnement utilisateur, y compris l’installation et la suppression de packages, peut être géré avec le nix-env commandes. Voici quelques-unes des commandes les plus utiles :

nix-env -iA <nixpkgs.pkg-name>
  • Pour désinstaller un package :
  • Pour mettre à niveau un package :
    nix-env -u <some-packages>

Exemple : installation de virtualenv avec Nix

Voici les étapes pour installer le package virtualenv en utilisant le gestionnaire de paquets Nix.

  • Rechercher virtualenv en utilisant le nix search commande:
    nix search virtualenv
    warning: using cached results; pass '-u' to update the cache
    * nixpkgs.pew (pew-1.2.0)
    Tools to manage multiple virtualenvs written in pure python
    
    * nixpkgs.python38Packages.pytest-virtualenv (python3.8-pytest-virtualenv)
    Create a Python virtual environment in your test that cleans up on teardown. The fixture has utility methods to ins>
    
    * nixpkgs.python38Packages.tox (python3.8-tox-3.23.0)
    Virtualenv-based automation of test activities
    
    * nixpkgs.python38Packages.virtualenv (python3.8-virtualenv)
    A tool to create isolated Python environments
    
    * nixpkgs.python38Packages.virtualenv-clone (python3.8-virtualenv-clone)
    Script to clone virtualenvs
    
    * nixpkgs.python38Packages.virtualenvwrapper (python3.8-virtualenvwrapper)
    Enhancements to virtualenv
    
    * nixpkgs.python39Packages.pytest-virtualenv (python3.9-pytest-virtualenv)
    Create a Python virtual environment in your test that cleans up on teardown. The fixture has utility methods to ins>
    
    * nixpkgs.python39Packages.tox (python3.9-tox-3.23.0)
    Virtualenv-based automation of test activities
    
    * nixpkgs.python39Packages.virtualenv (python3.9-virtualenv)
    A tool to create isolated Python environments
    
    * nixpkgs.python39Packages.virtualenv-clone (python3.9-virtualenv-clone)
    Script to clone virtualenvs
    
    * nixpkgs.python39Packages.virtualenvwrapper (python3.9-virtualenvwrapper)
    Enhancements to virtualenv

    Le résultat de la recherche offre plusieurs options pour installer virtualenv. Nous avons sélectionné nixpkgs.python38Packages.virtualenv pour les commandes suivantes.

  • Installer nixpkgs.python38Packages.virtualenv
    • Option 1 : utiliser nix-env commande:
    nix-env -iA nix-env -iA nixpkgs.python38Packages.virtualenv
    • Option 2 : utiliser Gestionnaire d’accueil

      Le contenu du fichier de configuration de Home Manager comprend :

       config, pkgs, ... :
      
         
        ...
        
        home.packages = [
          
          ...
          nixpkgs.python38Packages.virtualenv
          ...
        ];
        ...
      

      Pour appliquer la configuration de Home Manager :

    virtualenv est installé. Vous trouverez ci-dessous les commandes pour créer et activer un nouvel environnement python nommé myPythonEnv:

    virtualenv myPythonEnv 
    source myPythonEnv/bin/activate 

Génération

Chaque fois qu’un nix-env l’opération est terminée, une révision de l’environnement utilisateur appelée génération est nouvellement créé. Quelques commandes associées à la génération :

  • Pour lister les générations :
    nix-env --list-generations
  • Pour passer à une génération spécifique :
    nix-env --switch-generation <generation-number>
  • Pour supprimer des générations spécifiques :
    nix-env --delete-generations <generation-numbers separated by space>
  • Pour revenir au dernier nix-env commande (à la dernière génération) :
  • Pour supprimer les anciennes générations :
    nix-env --delete-generations old

Profils

Profils sont des groupes de générations afin que les différents utilisateurs n’interfèrent pas les uns avec les autres s’ils ne le souhaitent pas. Profils et Environnements utilisateur sont les mécanismes de Nix permettant à différents utilisateurs d’utiliser différentes configurations.

Dérivation

UN Dérivation est une expression Nix décrivant tout ce qui entre dans une action de construction de package (outils de construction, dépendances, sources, scripts de construction, variables d’environnement). C’est tout ce qui est nécessaire pour constituer un package.

Chaînes

Un canal est un dépôt git contenant une liste de packages. Les chaînes officielles sont vérifiées par Nix. Quelques commandes associées aux canaux :

Collecte des ordures

Lorsqu’un paquet est désinstallé, il n’est pas réellement supprimé du système même si aucun utilisateur ne s’y réfère. De cette façon, il ne sera pas re-téléchargé s’il arrive que vous en ayez à nouveau besoin. Les packages non suivis sont supprimés avec la commande garbage collector :

Conclusion

Nix est un gestionnaire de packages multiplateforme qui gère efficacement les dépendances par lui-même. Il simplifie le processus de gestion d’un environnement utilisateur via une méthode déclarative et facilite le partage d’un environnement utilisateur. Cependant, il s’accompagne d’une courbe d’apprentissage abrupte. D’après mon expérience, apprendre son utilisation en valait la peine.

Leave a Reply