web-dev-qa-db-fra.com

Quand et comment faut-il utiliser default.nix, Shell.nix et release.nix?

L'un des premiers types d'expression Nix que l'on rencontre en apprenant à utiliser le gestionnaire de packages Nix est default.nix; sur le merveilleux NixOS IRC channel j'ai appris l'existence de Shell.nix et release.nix ainsi que.

J'ai l'impression que - à peu près -default.nix doit être utilisé avec nix-build pour simplement construire le package, Shell.nix est utilisé avec nix-Shell pour créer un environnement interactif avec le package et release.nix est utilisé avec nixops dans le déploiement du package.

Comme cela est probablement incomplet et partiellement incorrect, et comme cela ne semble pas être clairement documenté, je voudrais une explication claire et précise de ces sortes de "fichiers standard"; en particulier, pour chacun de ces types de fichiers (ainsi que tout autre fichier standard qui me manque), je voudrais savoir:

  1. Quels sont les cas d'utilisation typiques d'un tel fichier? À quoi devraient-ils servir pas?
  2. Comment ce type de fichier est-il généralement structuré? Quelles sont les exigences minimales pour cela?
  3. Pourriez-vous montrer un exemple de paradigme d'un tel fichier dans son contexte d'utilisation, c'est-à-dire avec des instructions d'utilisation et y compris les lignes de code nécessaires pour l'utiliser dans le Shell ou une autre expression Nix?

Comme question supplémentaire, je veux savoir quels fichiers, le cas échéant, devraient être utilisés lors de l'installation d'un package dans un module NixOS? Comment cela se ferait-il?

32
Ixxie

Comme l'a dit @danbst uniquement default.nix et Shell.nix ont des significations spéciales pour l'outillage nix, en dehors de cela il n'y a pas de véritable standard et tout le monde est libre d'utiliser ce qui correspond le mieux à ses besoins.

Cela dit, cela ne signifie pas que vous ne pouvez pas définir votre propre ensemble de règles, personnellement pour un seul projet de dérivation, j'aime organiser les fichiers nix de la manière suivante:

  • default.nix: Utilisez callpackage pour importer derivation.nix.
  • derivation.nix: fichier de dérivation de style nixpkgs.
  • Shell.nix: fichier nix-Shell.
  • module.nix: Fichier de module NixOS, importation default.nix.
  • test.nix: Fichier de test NixOS.
  • release.nix: Déclaration Hydra jobset.

Nous avons eu une discussion sur ce sujet lors du Meetup Tokyo NixOS, un exemple d'une telle organisation de code peut être trouvé ici .

25
Eric

Tout d'abord, default.nix et Shell.nix ont des significations spéciales dans l'outil Nix, mais release.nix est pratique.

Suivant, default.nix est utilisé comme fichier par défaut lors de l'exécution de nix-build, et Shell.nix est utilisé comme fichier par défaut lors de l'exécution de nix-Shell. Comme tu l'as dit.

Suivant, default.nix n'est pas utilisé uniquement pour nix-build. Par exemple, <nixpkgs/lib/default.nix> est utilisé comme agrégateur pour les fonctions et ne contient pas de dérivations. Donc pas tous les default.nix est censé être "construit" (mais si default.nix est un ensemble d'attributs de dérivations, il sera constructible et nix-build les construira tous).

Suivant, nix-Shell utilisera default.nix sinon Shell.nix est trouvé.

Suivant, default.nix est utilisé comme fichier par défaut lors de l'importation du répertoire. Donc, si vous écrivez x = import ./some/directory;, puis ./some/directory/default.nix sera importé. Cela devrait en fait expliquer pourquoi "nix-build ." les usages default.nix.

Et enfin, il existe deux formats communs pour les dérivations dans default.nix: dérivation et callPackage dérivation. Vous ne pouvez pas nix-build le dernier. Presque tous les packages de nixpkgs sont écrits dans ce style, voir hello . Mais tu peux nix-build -E 'with import <nixpkgs> { }; callPackage ./path/to/default.nix { }' comme solution de contournement. nix-Shell prend également en charge ce -E argument.

29
danbst