Флейки
Флейки - экспериметальная особенность Nix, которая предоставляет способ написать выражения Nix (и пакеты), зависимости которых включены в lock-файле, улучшая воспроизводимость установок Nix. Lock-файлы вы могли видеть в других языках программирования: для Go - go.sum, для JS/TS - package-lock.json, для Rust - Cargo.lock и т.п.
Использование флейков
Если вы не хотите использовать флейки на постоянной основе, но вам нужна команда, требующая это, просто добавьте следующий флаг к ней:
Для постоянного включения флейков добавьте следующее в вашу конфигурацию:
В Home Manager:
Начало работы
Для создания базового флейка выполните команду nix flake init. Это создаст флейк для вашего проекта со следующим содержимым:
Схема флейка
Флейки содержат 4 атрибута верхнего уровня:
description: описание флейкаinputs: набор всех зависимостей флейкаoutputs: принимает на вход наборinputsи возвращает итоговый наборnixConfig: некоторые параметры для nix (из nix.conf), напримерextra-substituters
Схема inputs
В поле inputs вы должны указать все зависимости флейка. Чаще всего это сам nixpkgs.
Зависимости указываются в формате
Помимо такой записи, существует более короткая в url-формате:
Другие необязательные аргументы:
Существуют следующие типы:
indirect(по умолчанию): выполняет поиск поflake-idв реестре флейков, напримерnixpkgs/nixos-unstable/a3a3dda3bacf61e8a39258a0ed9c924eeca8e293укажет на канал nixpkgs-unstable с переданным коммитомpath: любой локальный каталог, содержащий flake.nix, напримерpath:/home/user/sub/dir(относительные пути также поддерживаются, должны начинаться с.)git(+http|+https|+ssh|+git|+file): указывает на репозиторий git
Примеры
mercurial(+http|+https|+ssh|+file): для репозиториеа Mercurial, по форме аналогичноgit, но с изменением наhg(hg+https,hg+file,hg+ssh, ...)tarball(+http|+https|+file): url на тарболлfile(+http|+https|+file): обычные файлы или архивы каталоговgithub: более эффективный способ получения репозиториев с GitHub, загружается какtarball, а неgit, так как требует меньше места на диске и скачивается быстрее
Примеры
gitlab: то же, что иgithub, но для GitLabsourcehut: то же, что иgithub, но для Sourcehut
У каждого инпута также существует параметр flake. По умолчанию он установлен на true, но если в репозитории нет файла flake.nix, вам нужно установить его в false. Тогда в стор будет скопировано просто содержимое репозитория, которое вы сможете использовать как угодно.
Схема outputs
Как только инпуты обработаны, они передаются в outputs вместе с self, который указывает на каталог этого флейка в сторе. Возвращает входные данные по следующей схеме:
Вы также можете определять свои атрибуты (как это делает Home Manager в homeConfigurations), но это те, о которых знает Nix.
Доступ к флейкам из Nix
Если вам нужно получить какое либо значение из флейка, вы можете использовать что-то вроде
Работа с флейками
Вот мы написали флейк, что делать с ним дальше? Разумеется, использовать с командой nix flake ...:
archive- архивирует флейк в /nix/storecheck- проверяет ваш флейк на работоспособность, правильность синтаксисаclone- клонирует репозиторий флейкаinfo- показывает информацию о флейкеinit- инициализирует флейк из шаблонаlock- создает lock-файл поinputsmetadata- показывает метаданные флейкаnew- создает новый флейк по шаблонуprefetch- скачивает дерево в /nix/storeshow- показывает выходы, предоставленные флейкомupdate- обновляет lock-файл
Помимо этого, команда nixos-rebuild switch будет читать свою конфигурацию из /etc/nixos/flake.nix, если он существует или не задан на другое местоположение.
Стандартный flake.nix для NixOS выглядит так: