Nix – уникальный, мощный менеджер пакетов и система сборки, которая использует уникальный подход к управлению пакетами и сборками программного обеспечения в Linux и других Unix-подобных операционных системах.
В отличие от других менеджеров пакетов, Nix предоставляет возможность устанавливать несколько версий одного пакета рядом друг с другом, предлагает атомарное обновление и откат, поддерживает управление пакетами для каждого пользователя, облегчает настройку сред разработки пакетов и многие другие возможности.
Менеджер пакетов Nix был изначально разработан для NixOS, дистрибутива Linux, который использует уникальный подход к управлению пакетами и конфигурациями. NixOS был начат как исследовательский проект Элко Долстра в 2003 году.
Nix особенно популярен в научных и исследовательских сообществах, где воспроизводимость и надежные сборки имеют большое значение.
Он также набирает обороты в других областях, таких как DevOps и управление облачной инфраструктурой, благодаря своим мощным возможностям и уникальному подходу к управлению пакетами.
Особенности
Менеджер пакетов Nix полностью отличается от традиционных менеджеров пакетов Linux в плане функциональности и возможностей.
1. Функциональная модель сборки
Nix собирает пакеты в изолированном окружении, обеспечивая воспроизводимость сборок и отсутствие влияния конфигурации хост-системы. Это достигается за счет использования чисто функциональной модели сборки.
2. Nix Store
Пакеты хранятся в хранилище Nix, которое представляет собой папку /nix/store
, содержащую все пакеты и их зависимости. Каждый пакет имеет уникальный криптографический хэш в качестве имени файла, что гарантирует, что различные версии пакетов могут сосуществовать без конфликтов.
3. Nix Expressions
Пакеты определяются с помощью специфического для данной области языка, называемого Nix Expression Language, который является функциональным языком. Выражения Nix описывают, как собирать пакеты из исходного кода.
4. Декларативный подход
Nix использует декларативный подход к управлению пакетами, когда вы указываете желаемое состояние системы, а Nix обеспечивает приведение системы к этому состоянию.
5. Воспроизводимые сборки
Благодаря чистой функциональной модели и изолированным сборкам Nix может гарантировать воспроизводимость сборок, то есть сборка одного и того же пакета на разных машинах в разное время даст бит-в-бит идентичные результаты.
6. Атомарное обновление и откат
Nix поддерживает атомарное обновление и откат, позволяя вам легко переключаться между различными версиями пакетов или всей системы.
7. Nix-каналы
Nix-каналы – это способ распространения коллекций выражений Nix, позволяющий легко обновлять и совместно использовать пакеты в разных системах.
8. NixOS
NixOS – это дистрибутив Linux, построенный на базе менеджера пакетов Nix, который выводит декларативный подход в конфигурированию системы и управлению пакетами на новый уровень.
9. NixOps
NixOps – это инструмент для развертывания машин NixOS в сети или облачной среде, использующий тот же декларативный подход, что и сама NixOS.
10. Многопользовательские среды
Nix поддерживает многопользовательское управление пакетами, позволяя нескольким пользователям одной системы устанавливать и управлять пакетами, не мешая друг другу. Эта возможность особенно полезна в средах совместного использования или средах разработки.
11. Изоляция и песочница
Благодаря изоляции зависимостей и сборке пакетов в песочнице Nix предотвращает побочные эффекты между сборками пакетов и средами выполнения. Такая изоляция повышает безопасность и снижает вероятность возникновения «ада зависимостей», когда конфликтующие зависимости приводят к сбою пакетов.
12. Неизменяемые пакеты
Пакеты в Nix хранятся в неизменяемом хранилище, которое обычно находится по адресу /nix/store
. Каждый пакет имеет уникальный путь, который включает хэш всех исходных данных, использованных при его создании. Такая конструкция предотвращает конфликты между пакетами и позволяет нескольким версиям пакета сосуществовать в одной системе без помех.
Язык выражений Nix
Язык выражений Nix – это специфический, чисто функциональный язык, используемый в основном для управления пакетами в экосистеме Nix. Вот некоторые ключевые характеристики языка:
- Чисто функциональный: Операции в языке Nix являются чистыми, то есть не имеют побочных эффектов. Это гарантирует, что выражения Nix могут быть надежно воспроизведены.
- Ленивая оценка: Nix оценивает выражения лениво, вычисляя значения только тогда, когда они необходимы. Это повышает производительность и позволяет создавать более сложные выражения.
- Динамическая типизация: Язык динамически типизирован, что означает, что типы проверяются во время выполнения, а не во время компиляции.
- Встроенные функции: Он включает встроенные функции, специально разработанные для взаимодействия с хранилищем Nix, которое является базовой системой, управляющей файлами и пакетами.
- Интерполяция строк: Nix поддерживает интерполяцию строк, что позволяет легко встраивать переменные в строки.
- Деривации: Основной концепцией Nix является идея производных, которые представляют собой точные описания того, как собрать пакет из исходного кода.
Пример:
Выражения Nix написаны на языке выражений Nix, который является чисто функциональным, специфичным для данной области языком, используемым для описания того, как пакеты должны быть собраны и составлены. Вот простое выражение Nix, определяющее пакет под названием hello
:
with import<nixpkgs>{}; stdenv.mkDerivation { name = "hello"; src = fetchFromGitHub { owner = "example"; repo = "hello"; rev = "0.1.0"; sha256 = "0000000000000000000000000000000000000000000000000000"; }; buildInputs = [ gcc ]; }
Давайте разберем этот код на части и посмотрим, что делает каждая опция:
with import <nixpkgs> {};
: Эта строка импортирует коллекцию пакетов Nixpkgs, которая представляет собой набор выражений Nix, определяющих большое количество пакетов.stdenv.mkDerivation { ... }
: Это функция, предоставляемая стандартным окружениемstdenv
, которая создает деривацию, являющуюся рецептом для создания пакета. В качестве аргументов она принимает набор атрибутов.name = "hello";
: Эта функция задает имя пакета «hello».src = fetchFromGitHub { ... };
: Здесь указывается исходный код пакета, который берется из репозитория GitHub. ФункцияfetchFromGitHub
предоставляется Nixpkgs и принимает такие аргументы, как владелец, имя репозитория, ревизия (хэш коммита или тег), а также хэш SHA256 исходного кода для проверки.buildInputs = [ gcc ];
: Здесь указываются зависимости, необходимые для сборки пакета, в данном случае GNU Compiler Collection (GCC).
Когда вы оцените это выражение Nix с помощью команды nix-build
, Nix получит исходный код с GitHub, создаст изолированную среду сборки с указанными зависимостями (GCC) и соберет пакет в соответствии с инструкциями по сборке (в данном примере не показаны).
Выражения Nix могут быть гораздо сложнее, определяя множество пакетов, устанавливая переменные окружения, исправляя исходный код и многое другое.
Ключевыми аспектами являются декларативный характер выражений, использование функций и атрибутов для определения пакетов, а также возможность составлять и переопределять существующие определения пакетов.
Для тех, кто хочет узнать больше о написании выражений Nix, на сайте
Руководство по NixOS и различных онлайн-ресурсах, таких как
nix.dev, представлены исчерпывающие руководства и учебники.
Заключение
Nix предлагает простой и эффективный способ работы с программным обеспечением в системах Linux и Unix. Он устраняет обычную головную боль, связанную с конфликтами и обновлениями программного обеспечения, обеспечивая бесперебойную работу компьютера.
С помощью Nix вы можете легко управлять различными версиями программного обеспечения и отменять обновления, если это необходимо. Это надежный инструмент как для личного использования, так и для профессиональных проектов, помогающий всем работать в единой программной среде.
Будь вы разработчиком, системным администратором или просто пользователем компьютера, Nix может сделать вашу жизнь проще, а работу продуктивнее.
Комментарии (0)