Construir versus dependencias en tiempo de ejecución en Nix
nixos nixpkgs (1)
Las dependencias de tiempo de ejecución son un subconjunto de las dependencias de tiempo de compilación que Nix determina automáticamente al escanear la salida generada para la parte de hash de la ruta de cada tienda de las dependencias de tiempo de compilación. Por ejemplo, si crea un paquete utilizando el compilador
/nix/store/abcdef...-foo-1.20
, Nix analizará todos los archivos en la salida generada para el bit hashabcdef...
Si se encuentra ese hash, entonces se supone que la salida hace referencia al compilador de alguna manera, por lo que es Kepts como una dependencia de tiempo de ejecución. Sin embargo, si ese hash no se produce, entonces la salida generada no tiene referencia al compilador y, por lo tanto, no puede acceder a ella en tiempo de ejecución, por lo quefoo-1.20
se trata como una dependencia de tiempo de compilación.Algunos paquetes registran grandes partes de su entorno de compilación con fines informativos / de depuración. Perl, por ejemplo, almacena cada pequeño detalle sobre las herramientas utilizadas para compilarlo, por lo que todas esas rutas de las tiendas terminan siendo tratadas como dependencias de tiempo de ejecución a pesar de que Perl no las necesita en tiempo de ejecución, pero Nix no puede saberlo: solo sabe que la ruta de la tienda de Perl hace referencia a esas herramientas. Ahora, los mantenedores de Nixpkgs generalmente hacen un esfuerzo para limpiar eso, es decir, recortando el archivo de registro que contiene todas las rutas de la tienda desde la instalación, etc., pero seguro que hay muchos paquetes en la base de datos que aún no se han optimizado para ese fin aun
Supongamos que desea compilar una versión de
openssh
que no depende de PAM. Luego puede eliminar la entrada de compilación de la expresión por medio de una anulación, es decir, reemplaza el argumentopam
que normalmente se pasa a la función de compilaciónopenssh
connull
. Para ello, almacene el siguiente archivo en~/.nixpkgs/config.nix
{ packageOverrides = super: let self = super.pkgs; in { openssh-without-pam = super.openssh.override { pam = null; }; }; }
y ahora instala ese paquete ejecutando:
$ nix-env -f "<nixpkgs>" -iA openssh-without-pam
Estoy empezando a familiarizarme con Nix, así que disculpas si me perdí la respuesta a mi pregunta en los documentos.
Quiero usar Nix para configurar una máquina de producción segura con el conjunto mínimo de bibliotecas y ejecutables. No quiero que haya compiladores u otras herramientas de compilación presentes porque pueden ser riesgos de seguridad.
Cuando instalo algunos paquetes, parece que dependen solo del conjunto mínimo de dependencias de tiempo de ejecución. Por ejemplo, si instalo apache-tomcat-8.0.23
, obtengo un tiempo de ejecución de Java (JRE) y los archivos JAR precreados que comprenden Tomcat.
Por otro lado, algunos paquetes parecen incluir una cadena de herramientas de compilación completa como dependencias. Tomando otro ejemplo basado en Java, cuando instalo spark-1.4.0
Nix despliega el kit de desarrollo de Java (JDK) que incluye un compilador, y también extrae la herramienta de compilación Maven, etc.
Por lo tanto, mis preguntas son las siguientes:
- ¿Los paquetes Nix distinguen entre las dependencias de compilación y tiempo de ejecución?
- ¿Por qué algunos paquetes parecen depender de las herramientas de compilación mientras que otros solo necesitan tiempo de ejecución? ¿Todo esto se debe a cómo el autor del paquete envolvió la solicitud?
- Si un paquete contiene dependencias de compilación que no deseo, ¿hay algo que yo, como operador, pueda hacer al respecto, excepto diseñar mi propio empaque alternativo para la misma aplicación?
Muchas gracias.