Pull to refresh

Nix — менеджер пакетов следующего поколения

Reading time2 min
Views4.2K
Всем привет,

Сегодня мы поговорим о Nix — чисто функциональном менеджере пакетов.



Зачем создавать еще один велосипед, в этот раз с квадратными колесами чисто функциональный?
Существующие решения:
  • не справляются с обновлением пакетов (обновление может удалить старые пакеты, из-за чего либо придется удалять все программы, зависимые от этих пакетов, либо так и смириться с противоречивым состоянием системы)
  • не учитывают все зависимости каждого отдельного пакета (и не могут этого сделать)
  • не знают и не могут знать точную комбинацию версий ядра, библиотек и пакетов, имеющихся на компьютере
  • ориентированы на централизованные репозитарии, у каждого их которых будет единая политика именования пакетов — вследствие чего, пакеты этих репозитариев часто несовместимы, даже если используется одна и та же нижележащая технология (RPM, DEB)


В результате много тяжелой работы сваливается на добровольцев, которые день и ночь бдят на службе отечества. :)

Как решить эту проблему? Очень просто, сказали ребята из университета Утрехта: обращаться с пакетами также, как со значениями вычисления выражений в чисто функциональных языках! Как-как, переспросит читатель?

Примерно так:
  • пакет это результат вычисления чистой функции, аргументами которой являются все зависимости пакета (другие пакеты, то есть)
  • пакет, будучи единожды установленным в системе, не меняется (никаких побочных эффектов)


Два предложения сверху означают только то, что Nix никогда не вносит изменения в файлы на диске, а только создает новые файлы.

«Как так?! У меня ж диск всего на 2 Гб!» — наверное, читателя посетила примерно такая мысль. :) Дело в том, что некоторые пакеты можно спокойненько удалить, если от них не зависят другие пакеты. Это очень похоже на «сборку мусора» в современных языках программирования.

Перечислим самые заметные преимущества Nix над другими менеджерами пакетов:
  • вполне допускается содержать несколько версий одного пакета одновременно (например, это может пригодиться, если двум каким-то приложениям требуются две версии одной и той же библиотеки)
    Сразу отметим, что операции обновления или удаления не могут повредить другие приложения вследствие того, что эти операции никогда не перезаписывают и не удаляют файлы, которые используются другими пакетами.
  • отслеживаются все зависимости отдельно взятого пакета — пакет, который заработавший на машине разработчика, заработает и на машине пользователя
  • атомарность операций обновления и возможность откатить любое обновление (даже если выдернете вилку из розетки во время обновления, система от этого не пострадает — но это, конечно, делать не следует по понятным причинам)
  • прозрачная поддержка пакетов, содержащих исходный код или откомпилированные бинарники (Nix может автоматически пропустить фазу компиляции, если пакет уже доступен в откомпилированным виде)
  • бинарные патчи (в дополнение к загрузке доступных бинарников автоматически, Nix может скачать разницу между двумя бинарниками)


На этой оптимистической ноте мы завершаем наш обзорчик.

update: форматирование
update: перенесено в коллективный блог
Tags:
Hubs:
Total votes 47: ↑38 and ↓9+29
Comments73

Articles