Een van de eerste typen Nix-expressies die je tegenkomt als je de Nix-pakketbeheerder leert gebruiken, is default.nix
; op het geweldige NixOS IRC-kanaal hoorde ik ook van het bestaan van shell.nix
en release.nix
.
Ik heb de indruk dat – ruwweg –default.nix
moet worden gebruikt met nix-build
voor het eenvoudig bouwen van het pakket, shell.nix
wordt gebruikt met nix-shell
om een interactieve omgeving met het pakket te creëren en release.nix
wordt gebruikt met nixops
bij het implementeren van het pakket.
Aangezien dit waarschijnlijk onvolledig en gedeeltelijk onjuist is, en aangezien dit niet duidelijk gedocumenteerd lijkt te zijn, zou ik graag een duidelijke en nauwkeurige uitleg krijgen van dit soort “standaardbestanden”; in het bijzonder voor elk van deze bestandstypen(evenals alle andere standaardbestanden die ik mis), zou ik graag willen weten:
- Wat zijn de typische gebruiksscenario’s voor een dergelijk bestand? Waar moeten ze nietvoor worden gebruikt?
- Hoe is dit bestandstype doorgaans gestructureerd? Wat zijn de minimale vereisten ervoor?
- Kun je een paradigmavoorbeeld van zo’n bestand binnen zijn gebruikscontextlaten zien, d.w.z. met gebruiksinstructies en inclusief regels code die nodig zijn om het in de shell of een andere Nix-expressie te gebruiken?
Als extra bonusvraag wil ik weten welke – indien aanwezig – van deze standaardbestanden moeten worden gebruikt bij het installeren van een pakket in een NixOS-module? Hoe zou dat gebeuren?
Antwoord 1, autoriteit 100%
Allereerst hebben default.nix
en shell.nix
een speciale betekenis in de Nix-tool, maar release.nix
is een handige. .
Vervolgens wordt default.nix
gebruikt als een standaardbestand bij het uitvoeren van nix-build
en wordt shell.nix
als standaard gebruikt bestand bij het uitvoeren van nix-shell
. Precies zoals je zei.
Vervolgens wordt default.nix
niet alleen gebruikt voor nix-build
. Bijvoorbeeld <nixpkgs/lib/default.nix>
wordt gebruikt als aggregator voor functies en bevat geen afleidingen. Dus niet elke default.nix
moet worden “gebouwd” (maar als default.nix
een attributenset van afleidingen is, kan deze worden gebouwd en nix-build
zal ze allemaal bouwen).
Vervolgens nix-shell
zaldefault.nix
gebruiken als er geen shell.nix
wordt gevonden.
Vervolgens wordt default.nix
gebruikt als standaardbestand bij het importeren van de directory. Dus als je x = import ./some/directory;
schrijft, dan wordt ./some/directory/default.nix
geïmporteerd. Dat zou eigenlijk moeten verklaren waarom "nix-build ."
default.nix
gebruikt.
En tot slot zijn er twee veelvoorkomende indelingen voor afleidingen in default.nix
: afleiding en callpackage
-afleiding. Je kunt de laatste niet nix-build
. Vrijwel elk pakket in nixpkgs is in deze stijl geschreven, zie hello
. Maar je kan
nix-build -E 'with import <nixpkgs> { }; callPackage ./path/to/default.nix { }'
als een oplossing. nix-shell
ondersteunt ook dit -E
argument.
Antwoord 2, autoriteit 89%
Zoals gezegd door @danbst hebben alleen default.nix
en shell.nix
een speciale betekenis voor de nix-tooling, daarbuiten is er geen echte standaard en is iedereen vrij om te gebruiken wat het beste bij hun behoeften past.
Dat gezegd hebbende, betekent dit niet dat je niet je eigen set regels kunt instellen, persoonlijk wil ik voor een enkel afleidingsproject nix-bestanden op de volgende manier ordenen:
default.nix
: gebruikcallpackage
omderivation.nix
te importeren.derivation.nix
: afleidingsbestand in nixpkgs-stijl.shell.nix
: nix-shell-bestand.module.nix
: NixOS-modulebestand, importeerdefault.nix
.test.nix
: NixOS-testbestand.release.nix
: Hydra-taaksetaangifte.
We hadden een gesprek over dit onderwerp tijdens de Tokyo NixOS-meetup, een voorbeeld van een dergelijke code-organisatie is te vinden hier.