# Nix (gestionnaire de paquets)

Nix est un gestionnaire de paquets multiplateforme ainsi qu'un langage de programmation qui vise à permettre la reproducibilité, la robustesse, la portabilité et la stabilité des systèmes d'information.
Les systèmes Nix utilisent leur propre langage de programmation du même nom spécifique à la gestion de paquets, déclaratif, paresseux et purement fonctionnel (voir section dédiée).
Nix utilise un modèle de déploiement dans lequel le logiciel est installé dans des répertoires uniques générés via des fonctions de hachages cryptographiques. Le hachage d'un paquet prend en compte les dépendances, ce qui facilite la gestion des dépendances.
Les dépendances sont suivies directement via un format intermédiaire appelé « dérivations ». Ce système a certains avantages :
* Les environnements Nix peuvent garder une trace des références et permettre une restauration atomique efficace, tout en optimisant le stockage ;
* Toutes les mises à niveau de Nix sont garanties à la fois atomiques et les paquets inutilisés peuvent être récupérés lorsqu'aucun autre n'en dépend ;
* Plusieurs utilisateurs peuvent installer des logiciels en toute sécurité sur le même système sans privilèges d'administrateur.
Ces avantages font tout l'interêt de Nix, en fournissant des environnements reproducibles, robustes et portables.
Nix prend entièrement en charge Linux et macOS et peut être installé en toute sécurité côte à côte avec un gestionnaire de paquets existant. NixOS peut également être un bon choix, car il s'agit d'une distribution Linux taillée sur mesure pour Nix (voir section dédiée). Nix peut également être installé sur Windows, par des moyens détournés tel que WSL.
Nix est utilisé pour l'empaquetage et la distribution de logiciels dans l'expérience LHCb du CERN.

## Langage de programmation

Nix utilise son propre langage de programmation purement fonctionnel, du même nom. Ce langage est à la fois déclaratif, paresseux, spécifique à la gestion de paquets, et purement fonctionnel. Ce fonctionnement reflète la philosophie de NixOS, à savoir la reproductibilité et la robustesse.
Le langage Nix inclut les types de données génériques, tels que string (texte), number (nombres), boolean (bit : vrai ou faux), null ; mais aussi d'autres types qui sont spécifiques à la gestion de paquets, tel que path, qui désigne un chemin d'accès. Ces exemples ne sont pas les seuls types.
Le code Nix est écrit dans des fichiers en .nix, et peut être évalués grâce à la commande nix eval.

### Exemples de code Nix

Opération arithmétique : 1+2
Liste de nombres : [ 2 3 8 0 ]
Chemin d'accès absolu : /bin/sl
Fonction qui accepte trois paramètres (x, y, z) ou plus, et retourne la somme des trois premiers : { x, y, z, ... }: z + y + x

## NixOS

NixOS est une distribution Linux utilisant Nix pour gérer les logiciels du système, y compris le noyau Linux.

## Nixpkgs

Nixpkgs est le référentiel de paquets construit sur le gestionnaire de paquets Nix. Selon Repology, en mars 2023, il contient plus de 80 000 paquets et en possède un nombre à jour plus élevé que tout autre référentiel de paquets. Les architectures prises en charge par Nixpkgs sont x86_64-linux, aarch64-linux, x86_64-darwin et aarch64-darwin. Les paquets pour ces architectures sont régulièrement construits, à l'aide d'un service d'intégration continue appelé Hydra, et les résultats de ces builds sont téléchargés dans un cache binaire public. Lorsque Nix installe un paquet, il vérifie son cache et télécharge le paquet à partir de là au lieu de le construire localement.
Nixpkgs est développé dans un seul référentiel git sur GitHub. Outre les paquets, il contient également le code source de NixOS.