¿Cuándo y cómo se deben usar default.nix, shell.nix y release.nix?
nixos nixops (2)
Uno de los primeros tipos de expresiones de Nix que se encuentran al aprender a usar el administrador de paquetes Nix es default.nix
; En el maravilloso canal de IRC de NixOS también me enteré de la existencia de shell.nix
y shell.nix
.
Tengo la impresión de que, aproximadamente, default.nix
se utilizará con nix-build
para nix-build
simplemente el paquete, shell.nix
se usa con nix-shell
para crear un entorno interactivo con el paquete y release.nix
se usa con nixops
en la implementación del paquete.
Como es probable que esto sea incompleto y parcialmente incorrecto, y dado que esto no parece estar claramente documentado, me gustaría una explicación clara y precisa de este tipo de "archivos estándar"; en particular, para cada uno de estos tipos de archivos (así como cualquier otro archivo estándar que me falte), me gustaría saber:
- ¿Cuáles son los casos de uso típicos de un archivo de este tipo? ¿Para qué no deben usarse?
- ¿Cómo se estructura este tipo de archivo normalmente? ¿Cuáles son los requisitos mínimos para ello?
- ¿Podría mostrar un ejemplo paradigmático de tal archivo dentro de su contexto de uso , es decir, con instrucciones de uso e incluyendo líneas de código necesarias para usarlo en el shell o en otra expresión de Nix?
Como una pregunta adicional, quiero saber cuál de estos archivos estándar, si alguno, debería usarse al instalar un paquete en un módulo NixOS. ¿Cómo se haría eso?
Como lo dijo @danbst, solo default.nix
y shell.nix
tienen significados especiales para las herramientas de shell.nix
, de ahí que no haya un estándar real y que todos puedan usar lo que mejor se adapte a sus necesidades.
Dicho esto, no significa que no pueda establecer su propio conjunto de reglas, personalmente para un proyecto de derivación única. Me gusta organizar los archivos nix de la siguiente manera:
-
default.nix
: use elcallpackage
decallpackage
para importarderivation.nix
. -
derivation.nix
: archivo de derivación de estilo nixpkgs. -
shell.nix
: archivo nix-shell. -
module.nix
: archivo de módulo NixOS, importdefault.nix
. -
test.nix
: archivo de prueba NixOS. -
release.nix
: declaración de trabajo Hydra.
Tuvimos una charla sobre este tema en la reunión de Tokyo NixOS, se puede encontrar un ejemplo de una organización de código de este tipo here .
En primer lugar, default.nix
y shell.nix
tienen significados especiales en la herramienta Nix, pero release.nix
es conveniente.
A continuación, default.nix
se utiliza como archivo predeterminado cuando se ejecuta nix-build
, y shell.nix
se usa como archivo predeterminado cuando se ejecuta nix-shell
. Justo como dijiste.
A continuación, default.nix
no se usa solo para nix-build
. Por ejemplo, <nixpkgs/lib/default.nix>
se usa como agregador para funciones, y no contiene derivaciones. Por lo tanto, no se supone que todos los default.nix
estén "construidos" (pero si default.nix
es un conjunto de atributos de derivaciones, se podrán nix-build
, y nix-build
los construirá todos).
A continuación, nix-shell
usará default.nix
si no se encuentra shell.nix
.
A continuación, se utiliza default.nix
como archivo predeterminado al importar el directorio. Así que si escribes x = import ./some/directory;
, luego ./some/directory/default.nix
será importado. Eso en realidad debería explicar por qué "nix-build ."
utiliza default.nix
.
Y, finalmente, hay dos formatos comunes para derivaciones en default.nix
: derivación y derivación de callPackage
. No puedes nix-build
este último. Casi cualquier paquete en nixpkgs está escrito en este estilo, vea hello
. Pero puedes nix-build -E ''with import <nixpkgs> { }; callPackage ./path/to/default.nix { }''
nix-build -E ''with import <nixpkgs> { }; callPackage ./path/to/default.nix { }''
como solución alternativa. nix-shell
también soporta este argumento -E
.