Флейки
Флейки - экспериметальная особенность 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-файл поinputs
metadata
- показывает метаданные флейкаnew
- создает новый флейк по шаблонуprefetch
- скачивает дерево в /nix/storeshow
- показывает выходы, предоставленные флейкомupdate
- обновляет lock-файл
Помимо этого, команда nixos-rebuild switch
будет читать свою конфигурацию из /etc/nixos/flake.nix, если он существует или не задан на другое местоположение.
Стандартный flake.nix для NixOS выглядит так: