Créer des environnements de développement avec Nix-shell sous Linux
Vous avez déjà eu des difficultés avec des versions de logiciels conflictuelles entre des projets ? Nix-shell peut vous aider ! Nix-shell vous permet de créer des environnements de développement personnalisés pour chaque projet, complets avec tous les outils et bibliothèques nécessaires.
Ces environnements sont isolés, ce qui signifie qu'ils n'interféreront pas avec d'autres projets sur votre système. Cette approche permet de maintenir votre flux de travail de développement fluide et évite le « enfer des dépendances » où les conflits logiciels causent des maux de tête.
Nix-shell facilite la création de ces environnements et le passage de l'un à l'autre, garantissant des configurations cohérentes sur différentes machines. Cela peut vous faire gagner énormément de temps, à vous et à votre équipe.
Dans ce guide, nous vous expliquerons les étapes de création et de gestion d’environnements de développement isolés en utilisant nix-shell sous Linux.
Qu'est-ce que Nix-shell ?
Nix est un gestionnaire de paquets et un système de construction puissant qui offre une approche fonctionnelle et déclarative pour gérer les dépendances logicielles. Il utilise une approche purement fonctionnelle, traitant les paquets comme des valeurs dans les langages de programmation fonctionnels.
Nix-shell, un utilitaire en ligne de commande inclus avec le gestionnaire de paquets Nix, vous permet de créer des environnements de développement isolés basés sur des expressions Nix. Ces environnements encapsulent tous les outils, bibliothèques et dépendances nécessaires pour un projet spécifique.
En construisant chaque dépendance de manière indépendante et en évitant les interférences, nix-shell élimine le « enfer des dépendances » et offre un contrôle précis sur les dépendances dans vos environnements de développement et de production.
Cette isolation et cette reproductibilité garantissent une configuration cohérente sur différents systèmes et permettent une collaboration fluide entre les développeurs.
Avantages de l'utilisation de Nix-shell
- Isolation : Chaque environnement
nix-shellest isolé de votre système et des autres environnements, empêchant les conflits entre les dépendances. - Reproductibilité : Les environnements sont définis dans le code, garantissant qu'ils peuvent être reproduits sur n'importe quel système exécutant Nix.
- Mises à niveau atomiques et retours en arrière : L'approche de Nix en matière de gestion des paquets prend en charge les mises à niveau et les retours en arrière atomiques, ce qui rend sûr l'expérimentation avec différentes dépendances.
- Tester des packages sans les installer : Une des fonctionnalités utiles du gestionnaire de packages Nix est qu'il permet aux utilisateurs de tester des packages sans avoir à les installer localement. Cela peut être utile lorsque vous souhaitez utiliser une application particulière temporairement.
Comment utiliser Nix-shell pour créer et gérer des environnements de développement
Comme déjà indiqué, nix-shell crée des environnements séparés et reproductibles pour les dépendances des projets. Cette isolation empêche les conflits entre les dépendances de différents projets.
Voici comment vous pouvez créer et gérer des environnements de développement en utilisant nix-shell.
Créer une expression Nix
La première étape consiste à créer une expression Nix qui décrit les dépendances requises pour votre projet. Cela se fait généralement dans un fichier nommé default.nix ou shell.nix à la racine de votre projet.
Créons un projet exemple nommé myproject.
$ mkdir myprojectAllez dans le répertoire myproject :
$ cd myprojectCréez un simple fichier shell.nix :
$ nano shell.nixAjoutez les lignes suivantes dedans :
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = [
pkgs.python38
pkgs.nodejs
pkgs.ruby
];
}Ce fichier déclare un environnement de développement avec Python 3.8, Node.js et Ruby comme dépendances. Lorsque vous exécutez nix-shell dans le répertoire contenant ce fichier, Nix téléchargera et installera ces packages dans un environnement isolé, sans affecter vos packages système globaux.
Vous pouvez également spécifier les dépendances en une seule ligne comme ci-dessous :
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = with pkgs.buildPackages; [ python38 nodejs ruby ];
}Enregistrez le fichier et fermez-le.
Environnements ad hoc
Pour un environnement de développement rapide et ad hoc, vous pouvez exécuter
nix-shellavec l'option-psuivie des paquets dont vous avez besoin. Par exemple :nix-shell -p python39Packages.numpy python39Packages.scipyCette commande lance un
nix-shellavec Python 3.9, NumPy et SciPy disponibles.
Entrée dans le Nix Shell
Une fois que vous avez votre expression Nix, vous pouvez entrer dans l'environnement isolé en utilisant la commande suivante :
$ nix-shellOu,
$ nix-shell shell.nixPour garantir que les outils installés par le système n'interfèrent pas avec vos dépendances définies, utilisez l'option --pure avec nix-shell.
$ nix-shell --pure shell.nixCela créera une nouvelle session de shell avec les dépendances spécifiées (Python 3.8, Node.js et Ruby) disponibles. Toutes les commandes que vous exécuterez dans ce shell auront accès à l'environnement isolé.
Utilisation de Nix-shell pour le développement
Dans l'environnement nix-shell, vous pouvez exécuter vos outils de développement, scripts et commandes comme vous le feriez normalement.
L'environnement isolé garantit que les dépendances de votre projet sont disponibles et cohérentes, quel que soit la configuration du système hôte.
Vous pouvez le vérifier en consultant les versions des dépendances :
[nix-shell:~/myproject]$ python -V
Python 3.8.19[nix-shell:~/myproject]$ node -v
v18.19.1[nix-shell:~/myproject]$ ruby -v
ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]Comme vous le voyez dans la sortie ci-dessus, l'environnement de développement est prêt avec Python 3.8.19, Node 18.19.1 et Ruby 3.1.4 installés. Vous pouvez maintenant commencer à créer et à tester vos applications.
Quitter Nix-shell
Pour sortir du nix-shell, il suffit de taper :
$ exitOu vous pouvez appuyer sur CTRL+D pour quitter le shell.
Lorsque vous quittez l'environnement nix-shell, les actions suivantes se produisent :
- Fin de l'Isolement de l'Environnement : L'environnement de développement isolé créé par
nix-shellest temporaire et n'existe que pendant la durée de la session du shell. Une fois que vous quittez lenix-shell, l'isolement fourni par cet environnement est supprimé, et votre shell revient à son état précédent. - Les packages et dépendances sont déchargés : Tous les packages, dépendances et variables d'environnement qui ont été chargés et rendus disponibles dans l'environnement
nix-shellsont déchargés et ne sont plus accessibles depuis votre shell. Toutes les commandes ou outils qui dépendaient de ces packages ne fonctionneront plus à moins qu'ils ne soient installés au niveau du système ou dans un autre environnement. - Rétablissement de l'environnement Shell : L'environnement shell, y compris PATH, les variables d'environnement et autres paramètres, revient à son état avant l'entrée dans le
nix-shell. Toutes les modifications apportées à ces paramètres dans lenix-shellsont annulées. - Pas de changements persistants : Par défaut,
nix-shelln'apporte aucune modification persistante à votre système. L'isolation et les modifications effectuées dans l'environnementnix-shellsont temporaires et n'affectent pas la configuration globale de votre système ni les paquets installés. - État du projet : Tous les fichiers ou modifications que vous avez effectués dans l'environnement
nix-shell, tels que la création ou la modification de fichiers dans votre répertoire de projet, persisteront même après la sortie dunix-shell. Seul l'environnement lui-même est temporaire, pas les fichiers sur lesquels vous avez travaillé. - Collecte des déchets : Au fil du temps, à mesure que vous utilisez plus de paquets et éventuellement que vous les mettez à jour, le magasin Nix peut augmenter en taille car il conserve les anciennes versions des paquets. Ces paquets et environnements restent accessibles jusqu'à ce qu'une collecte des déchets Nix soit effectuée. Quitter
nix-shellne déclenche pas automatiquement la collecte des déchets. Vous pouvez lancer manuellement une collecte des déchets pour supprimer les paquets inutilisés du magasin Nix, libérant ainsi de l'espace disque. Consultez notre guide pour bien commencer avec Nix pour savoir comment nettoyer les paquets inutilisés.
En résumé, quitter nix-shell vous sépare proprement de l'environnement de développement temporaire qu'il fournissait, sans affecter l'environnement global de votre système ni supprimer aucune donnée de vos projets. Les paquets utilisés restent dans le magasin Nix pour une réutilisation efficace, garantissant que votre système reste propre et que vos environnements de développement soient reproductibles et isolés.
Si vous avez besoin d'utiliser à nouveau le même environnement de développement, vous pouvez simplement réentrer dans le nix-shell en exécutant la commande nix-shell depuis le même répertoire contenant votre fichier shell.nix. Cela recréera l'environnement isolé avec les dépendances spécifiées.
Questions Fréquemment Posées
Voici une liste de questions fréquemment posées (FAQ) et de réponses sur Nix.
Q : Qu'est-ce que nix-shell ?
A : nix-shell est un outil en ligne de commande fourni par le gestionnaire de paquets Nix qui crée un environnement shell temporaire avec des paquets logiciels spécifiques installés. Il est conçu pour fournir un environnement isolé pour le développement ou les tests sans affecter le reste du système.
Q : Comment installer nix-shell ?
A : nix-shell fait partie du gestionnaire de paquets Nix. Pour utiliser nix-shell, vous devez d'abord installer Nix sur votre système. Vous pouvez installer Nix en vous référant à notre guide d'installation de Nix.
Q : Comment utiliser nix-shell pour créer un environnement isolé ?
A : Pour créer un environnement isolé, vous pouvez utiliser un fichier shell.nix dans le répertoire de votre projet qui spécifie les dépendances requises. Exécuter nix-shell dans le répertoire contenant shell.nix vous placera dans un shell avec ces dépendances disponibles. Alternativement, pour des environnements ponctuels, vous pouvez utiliser nix-shell -p package1 package2 ... pour spécifier directement les paquets.
Q : Puis-je utiliser nix-shell sur n'importe quel système d'exploitation ?
A : nix-shell fonctionne sur la plupart des systèmes d'exploitation de type Unix, y compris les distributions Linux et macOS. Il n'est pas pris en charge nativement sur Windows, mais les utilisateurs de Windows peuvent y accéder via le Sous-système Windows pour Linux (WSL).
Q : Que se passe-t-il pour mon environnement quand je quitte nix-shell ?
A : Lorsque vous quittez nix-shell, l'environnement qu'il a créé est démantelé. Les ajouts temporaires à votre PATH et à d'autres variables d'environnement sont annulés, ramenant votre shell à son état précédent. Les paquets utilisés restent dans le magasin Nix pour un usage futur mais ne sont plus accessibles en dehors de nix-shell sauf s'ils sont installés globalement.
Q : Comment nix-shell évite-t-il le "cauchemar des dépendances" ?
A : nix-shell utilise l'approche purement fonctionnelle du gestionnaire de paquets Nix pour la gestion des paquets, où chaque paquet est construit et stocké dans un environnement isolé. Les dépendances de chaque paquet sont définies explicitement et n'interfèrent pas les unes avec les autres, évitant ainsi le problème courant des dépendances conflictuelles.
Q : Puis-je sauvegarder l'état d'un environnement nix-shell ?
A : Bien que nix-shell lui-même ne sauvegarde pas directement l'état des environnements, la nature déclarative du fichier shell.nix signifie que votre environnement est reproductible. Toute personne disposant du même shell.nix peut recréer l'environnement identique. Pour des scénarios plus complexes, envisagez d'utiliser la capacité de Nix à créer des packages personnalisés ou même des configurations système complètes.
Q : Comment ajouter ou supprimer des paquets d'un environnement nix-shell ?
A : Pour modifier les packages dans votre environnement, éditez le fichier shell.nix pour ajouter ou supprimer des packages de la liste buildInputs dans le fichier shell.nix. Si vous utilisez un environnement ad hoc créé avec -p, ajustez simplement la liste des packages que vous fournissez à la commande.
Q : Comment puis-je effectuer la collecte des ordures pour les paquets inutilisés ?
A : Nix vous permet d'effectuer manuellement la collecte des déchets pour supprimer les paquets inutilisés du magasin Nix, libérant ainsi de l'espace disque. Vous pouvez le faire en exécutant nix-collect-garbage -d depuis la ligne de commande.
Conclusion
Nix-shell vous aide à garder votre développement organisé. Il vous permet de créer des espaces de travail séparés pour chaque projet, avec tous les outils dont ils ont besoin. Cela empêche les conflits entre les projets et garantit que tout fonctionne de la même manière sur différents ordinateurs. Maintenant, vous pouvez vous concentrer sur le codage, et non sur la lutte contre les conflits logiciels.
Ressource:
- Documentation officielle de Nix-shell
Lecture Connexe:
- Créer des environnements virtuels NodeJS en utilisant Conda sous Linux
- Créer des environnements virtuels Rust avec Conda sous Linux
- Créer des environnements virtuels Golang en utilisant Conda sous Linux
- Comment gérer les packages Python en utilisant PIP
- Pipx – Installer et exécuter des applications Python dans des environnements isolés
- Pipenv – L'outil d'emballage Python officiellement recommandé
