NixOS 생태계에서 개발자들이 겪는 오랜 난제 중 하나는 특정 패키지 버전을 고정하는 복잡성이었습니다. Nixpkgs 릴리스를 업데이트할 때 의존하던 패키지 버전이 사라지거나, 새로운 버전으로 인해 기존 도구가 오작동하는 경우가 빈번했습니다. 이를 해결하기 위해 개발자들은 원하는 패키지 버전이 포함된 과거 커밋을 직접 찾아 플래이크(flake) 입력으로 고정해야 했고, 이 과정은 비효율적이며 평가 시간을 지연시키는 원인이 되었습니다. 이러한 문제를 해결하기 위해 등장한 것이 바로 'Nixpkgs-Multiverse' 프로젝트입니다.
Nixpkgs-Multiverse는 2017년부터 2026년까지 하이드라(Hydra)에서 빌드 및 캐시된 1,393개의 Nixpkgs 리비전과 289,521개의 (속성, 버전) 쌍을 단 5.18MB 크기의 JSON 인덱스로 관리합니다. 이 프로젝트의 핵심은 일반 플래이크 입력과 달리, 사용 여부와 관계없이 즉시 모든 데이터를 가져오는 대신, ‘builtins.fetchTree’와 ‘narHash’를 활용해 실제 참조된 리비전만 지연 로딩(lazy loading)한다는 점입니다. 이는 불필요한 네트워크 트래픽과 평가 시간을 획기적으로 줄여줍니다. 예를 들어, 여러 개의 Nixpkgs 입력을 사용하는 경우 평가 전에 수십 초가 소요될 수 있지만, Nixpkgs-Multiverse는 1,393개 리비전을 제공하면서도 초기 JSON 파싱에 0.20초밖에 걸리지 않습니다.
이 프로젝트는 약 200줄의 Nix 코드와 5MB 규모의 JSON 파일만으로 작동하며, 패키지를 직접 빌드하거나 미러링, 호스팅하지 않습니다. 개발자는 ‘versions.python3."3.6.2"’와 같이 특정 버전 속성을 지정하여 원하는 패키지를 실행할 수 있으며, ‘versionsOf’ 함수를 통해 특정 패키지의 모든 과거 버전을 조회할 수도 있습니다. 또한, ‘at’ 함수를 사용해 특정 릴리스, 날짜, 또는 커밋에 해당하는 완전한 Nixpkgs 리비전을 선택할 수 있어, 서로 다른 리비전의 패키지를 하나의 셸이나 빌드 환경에서 함께 사용하는 것이 가능해집니다. 이는 Nix의 내포적 모델(intensional model) 덕분에 동일한 패키지의 여러 버전이 ‘/nix/store’에 공존할 수 있다는 원리를 활용한 것으로, 개발자들에게 전례 없는 유연성을 제공합니다.
Nixpkgs-Multiverse는 NixOS 개발 환경의 효율성을 크게 향상시키고, 복잡한 의존성 관리 문제를 해결하는 데 중요한 역할을 할 것으로 보입니다. 과거에는 커밋 해시로만 접근 가능했던 패키지 이력을 버전 번호로 탐색할 수 있게 함으로써, 개발자들이 더욱 직관적이고 효율적으로 원하는 패키지 버전을 찾아 사용할 수 있게 됩니다. 이는 개발 생산성 향상뿐만 아니라, 다양한 프로젝트에서 특정 버전의 패키지를 안정적으로 유지해야 하는 필요성을 충족시켜 줄 것입니다. 특히, 여러 버전의 패키지가 필요한 복잡한 개발 환경이나, 과거 버전에 대한 의존성이 강한 레거시 프로젝트 유지보수에 큰 도움이 될 것으로 기대됩니다.