Nix to wieloplatformowy zarządca pakietów dla systemów Uniksopodobnych, a także narzędzie do instancjonowania i zarządzania tymi systemami, stworzony w 2003 roku przez Eelco Dolstrę.

Podejście Nix wykorzystuje model, w którym pakiety oprogramowania są instalowane w unikalnych katalogach o niezmiennej zawartości. Nazwy tych katalogów odpowiadają skrótom kryptograficznym, które uwzględniają wszystkie zależności pakietu, w tym innych pakietów zarządzanych przez Nix. W rezultacie nazwy pakietów Nix identyfikują zawartość, ponieważ pakiety o tej samej nazwie będą miały te same dane wejściowe i tę samą platformę kompilacji, a zatem ten sam wynik kompilacji.

Implementacja Przepisy na pakiety dla Nix są pisane w specjalnie stworzonym „języku Nix” – deklaratywnym, czysto funkcjonalnym, leniwie wartościowanym, dynamicznie typowanym języku programowania. Charakterystycznymi cechami języka Nix są ciągi znaków z „kontekstem”, interpolacja ciągów znaków, ścieżki dostępu do systemu plików oraz „wcięte ciągi znaków”, które w połączeniu pozwalają zwięźle wyrażać zależności między danymi systemu plików podczas określania zawartości nowych plików.

Zależności między plikami, zgodnie z deklaracją w języku Nix, są automatycznie śledzone i utrwalane w „magazynie Nix”. Nowe pliki w magazynie Nix są tworzone poprzez „derywacje”. Derywacja to trwała struktura danych, która określa plik wykonywalny, argumenty i zmienne środowiskowe dla jego wywołania oraz inne pliki do odczytu z magazynu Nix. Plik wykonywalny jest następnie uruchamiany w piaskownicy, która uniemożliwia dostęp do czegokolwiek poza jawnie określonymi plikami wejściowymi i zezwala na zapis wyłącznie do wyznaczonej ścieżki wyjściowej. Nix zachowuje informacje o zależnościach w plikach wyjściowych, skanując w poszukiwaniu charakterystycznych skrótów używanych w nazwach katalogów pakietów.

Automatyczne śledzenie odniesień zapewnia integralność pakietów, nawet gdy są one przesyłane między innymi maszynami. Umożliwia również zbieranie nieużywanych pakietów, gdy żaden inny pakiet nie jest od nich zależny. Kosztem większych wymagań dotyczących pamięci masowej, wszystkie uaktualnienia w Nix są gwarantowane jako atomowe i umożliwiające wydajny rollback. Unikalne nazwy katalogów umożliwiają instalowanie wielu pakietów z różnymi wersjami bibliotek współdzielonych i rzekomo eliminują tzw. piekło zależności. Pozwala to również wielu użytkownikom bezpiecznie instalować oprogramowanie w tym samym systemie bez uprawnień administratora. W rezultacie model zarządzania pakietami i wdrażania Nix reklamuje bardziej niezawodne, powtarzalne i przenośne pakiety.

Nix w pełni obsługuje systemy Linux, macOS i WSL i można go bezpiecznie zainstalować obok innego menedżera pakietów.

Nixpkgs Nixpkgs to repozytorium pakietów zbudowane na bazie menedżera pakietów Nix. Według Repology, od stycznia 2025 r. zawiera ponad 122 000 pakietów i ma większą liczbę aktualnych pakietów niż jakiekolwiek inne repozytorium pakietów. Systemy operacyjne obsługiwane przez Nixpkgs to przede wszystkim Linux i Darwin, z częściowym wsparciem dla Windowsa i wariantów BSD. Obsługiwane architektury procesorów obejmują x86-64 i ARM. Pakiety dla tych architektur są regularnie kompilowane przy użyciu usługi ciągłej integracji zwanej Hydra, a wyniki tych kompilacji są przesyłane do publicznej pamięci podręcznej plików binarnych. Kiedy Nix instaluje pakiet, sprawdza tę pamięć podręczną i pobiera pakiet binarny, aby uniknąć jego lokalnego kompilowania.

Nixpkgs jest rozwijany w pojedynczym repozytorium Git na GitHubie. Oprócz pakietów zawiera także kod źródłowy dla systemu NixOS.

Projekty wykorzystujące Nix NixOS to dystrybucja Linuksa wykorzystująca Nix do zarządzania całą konfiguracją systemu, łącznie z jądrem Linux.

Nix jest używany do opakowania i dystrybucji oprogramowania w eksperymencie LHCb CERN. Nix jest też podstawą platform rozwoju oprogramowania dystrybuowanego takich jak Replit czy Firebase Studio.

Przypisy

Linki zewnętrzne

Oficjalna strona Nix na GitHubie Dyskusja pomiędzy deweloperami na liście dyskusyjnej Debiana (2008, angielski)

Kategoria:Programowanie funkcyjne Kategoria:Linux Kategoria:Otwarte oprogramowanie