Grail: cómo llevar rangos de versiones a Nixpkgs tras una década sin ellos

Fuentes: The holy grail of nixpkgs: version ranges

Grail es una nueva herramienta —presentada por su autor en el blog de nixmultiverse— que introduce por primera vez soporte para rangos de versiones en Nixpkgs, el gestor de paquetes funcional sobre el que se construye NixOS. Hasta ahora, cada atributo del repositorio tenía una única versión ligada a la revisión del árbol, por lo que no existían “versiones entre las que elegir” y, en consecuencia, Nix nunca había necesitado un resolvedor de dependencias.

La pieza que lo hace posible es nixpkgs-multiverse, un índice que conserva más de 309 000 versiones de paquetes a lo largo de 1 541 revisiones de nixos-unstable. Sobre ese historial, Grail ofrece un pequeño lenguaje de consulta inspirado en Spack: el operador @ adjunta un rango a un atributo (python3@>=3.10), .. expresa intervalos cerrados, ^ encadena restricciones en un grupo de coexistencia que debe resolverse en una única revisión, y , y || aplican lógica AND/OR.

Resolver esas restricciones es un problema de satisfacibilidad booleana (NP-duro), así que Grail recurre a Answer Set Programming mediante el solver clingo, codificando los datos de cada paquete como hechos y reglas lógicas, y minimizando el número de revisiones y de eras de glibc necesarias. El sistema también incorpora una política de compatibilidad con glibc similar a la de Spack para evitar combinaciones inviables.

El artículo muestra ejemplos prácticos —desde una combinación satisfecha de python3 y openssl en una revisión de 2022 hasta una declarada insatisfacible entre python3 3.8 y postgresql 13— y explica cómo visualizar el plan del solver en SVG y verificar formalmente la corrección del enfoque. El autor sitúa Grail como la “búsqueda del santo grial” del ecosistema Nix: dotar a los mantenedores de una forma expresiva y reproducible de declarar versiones mínimas, máximas o compatibles.