Когда и как следует использовать default.nix, shell.nix и release.nix?

Один из первых типов выражения Nix, с которым можно столкнуться при изучении использования диспетчера пакетов Nix, - это default.nix; на замечательном IRC-канале NixOS я узнал о существовании shell.nix и release.nix.

У меня сложилось впечатление, что примерно -default.nix должен использоваться с nix-build для простого создания пакета, shell.nix используется с nix-shell для создания интерактивной среды с пакетом, а release.nix используется с nixops при развертывании пакета.

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

  1. Каковы типичные варианты использования такого файла? Для чего их не использовать?
  2. Как обычно структурирован этот тип файлов? Какие минимальные требования для этого?
  3. Не могли бы вы показать пример парадигмы такого файла в контексте его использования, то есть с инструкциями по использованию и включением строк кода, необходимых для его использования в оболочке или другом выражении Nix?

В качестве дополнительного бонусного вопроса я хочу знать, какие из этих стандартных файлов следует использовать при установке пакета в модуль NixOS? Как это сделать?


person Ixxie    schedule 20.05.2017    source источник


Ответы (2)


Как сказал @danbst, только default.nix и shell.nix имеют особое значение для инструментария nix, поэтому настоящего стандарта нет, и каждый волен использовать то, что больше всего соответствует его потребностям.

Тем не менее, это не означает, что вы не можете установить свой собственный набор правил, лично для одного производного проекта мне нравится упорядочивать файлы nix следующим образом:

  • default.nix: используйте callpackage для импорта derivation.nix.
  • derivation.nix: производный файл стиля nixpkgs.
  • shell.nix: файл nix-shell.
  • module.nix: файл модуля NixOS, импорт default.nix.
  • test.nix: тестовый файл NixOS.
  • release.nix: Объявление набора заданий Hydra.

Мы говорили на эту тему на токийской встрече NixOS, пример такой организации кода можно найти здесь.

person Eric    schedule 19.06.2017
comment
Ясно объяснил! Это нужно добавить в документацию. - person Ixxie; 20.06.2017
comment
также: flake.nix для nix flakes - person Zyansheep; 20.01.2021

Прежде всего, default.nix и shell.nix имеют особое значение в Nix tool, но release.nix - для удобства.

Затем default.nix используется как файл по умолчанию при запуске nix-build, а shell.nix используется как файл по умолчанию при запуске nix-shell. Как ты и сказал.

Далее, default.nix не используется только для nix-build. Например, <nixpkgs/lib/default.nix> используется как агрегатор для функций и не Не содержат выводов. Таким образом, не каждый default.nix должен быть «построен» (но если default.nix является набором атрибутов производных, он будет строиться, и nix-build построит их все).

Затем nix-shell будет использовать default.nix, если shell.nix не найден.

Затем default.nix используется как файл по умолчанию при импорте каталога. Так что если вы напишете x = import ./some/directory;, то ./some/directory/default.nix будет импортирован. На самом деле это должно объяснить, почему "nix-build ." использует default.nix.

И, наконец, в default.nix есть два общих формата деривации: деривация и callPackage деривация. Вы не можете nix-build последнее. Практически любой пакет в nixpkgs написан в этом стиле, см. hello. Но вы можете nix-build -E 'with import <nixpkgs> { }; callPackage ./path/to/default.nix { }' в качестве обходного пути. nix-shell также поддерживает этот -E аргумент.

person danbst    schedule 22.05.2017
comment
Спасибо, это очень помогает прояснить default.nix. К сожалению, он все еще не завершен: в нем все еще отсутствует парадигмальный пример использования default.nix на практике, а также его контекст приложения. Я бы тоже хотел услышать то же самое о release.nix и shell.nix. - person Ixxie; 31.05.2017