Как разбить /etc/nixos/configuration.nix на отдельные модули?

Предположим, у меня очень простой файл конфигурации NixOS :

{ config, pkgs, ... }: { imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix ]; # SOME STUFF environment.systemPackages = with pkgs; [ emacs gitFull ]; # SOME STUFF } 

Я знаю, что NixOS реализует модульную систему , а модуль – это .nix файл. Каждый .nix файл должен содержать любое допустимое выражение Nix (например, функцию или набор). Это означает, что файл конфигурации NixOS /etc/nixos/configuration.nix сам является модулем, содержащим выражение Nix.

Я также знаю, что для того, чтобы сделать выражение Nix в другом модуле видимым для модуля, с которым я работаю, я могу использовать встроенную функцию import .

Я хочу разбить объявление системных пакетов (список, содержащий emacs и gitFull ) в файл packages.nix . Как разбить файл конфигурации NixOS на отдельные модули?

  • управлять пакетами системного профиля в NixOS
  • Как построить 32-битное приложение в 64-разрядной системе с помощью диспетчера пакетов Nix?
  • Команда, чтобы посмотреть, какая версия NixOS работает на моей машине?
  • Файлы заголовков Nixos X11 не найдены
  • Установка NixOS в многозагрузочной системе с GRUB (от установки Arch)
  • Java SDK для NixOS для IntelliJ
  • cURL не признает сертификат
  • Как найти имя пакета Nix для его установки в файле configuration.nix?
  • One Solution collect form web for “Как разбить /etc/nixos/configuration.nix на отдельные модули?”

    Выражения Nix

    Выражение Nix похоже на любое выражение языка программирования: все, что оценивается значением или функцией. Значение в этом случае также может быть списком или набором. Поскольку модуль Nix (файл с расширением .nix ) может содержать любое выражение Nix, вы ожидаете, что файл конфигурации NixOS ( /etc/nixos/configuration.nix ) должен содержать одно выражение Nix в качестве содержимого файла.

    Файл конфигурации NixOS содержит выражение Nix формы:

     {config, pkgs, ...}: { /* various configuration options */ } 

    Если вы посмотрите внимательно, вы увидите, что это функция , потому что функции следуют форме формы pattern: form . Вы также можете увидеть, что это функция, которая принимает набор и возвращает набор. Например, если у вас есть функция f = {x, y}: {a = x + y;} , вы можете назвать ее как f {x=1; y=2;} f {x=1; y=2;} и вернуть набор {a=3;} .

    Это означает, что когда вы вызываете nixos-rebuild switch , что-то вызывает функцию внутри файла конфигурации NixOS с набором, который должен содержать атрибуты config и pkgs .

    импорт

    Следуя примеру ./hardware-configuration.nix , простой способ извлечь список пакетов в отдельный модуль packages.nix – это просто разорвать параметр environment.systemPackages и поместить параметр ./packages.nix в imports . Ваш /etc/nixos/configuration.nix будет выглядеть так:

     { config, ... }: { imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix # Include the package list. ./packages.nix ]; # SOME STUFF # SOME STUFF } 

    Ваш /etc/nixos/packages.nix будет выглядеть так:

     { pkgs, ... }: { environment.systemPackages = with pkgs; [ emacs gitFull ]; } 

    Как это работает? Когда вы запускаете nixos-rebuild switch , процесс, который оценивает выражения Nix и решает установить пакеты, и так далее, вызовы configuration.nix с набором атрибутов, некоторые из которых являются config и pkgs .

    Он находит imports атрибутов внутри возвращаемого набора, поэтому он оценивает каждое выражение Nix в модулях, которые imports содержит те же аргументы ( config , pkgs и т. Д.).

    Вы должны иметь pkgs в качестве аргумента (или, технически говоря, атрибут набора, который сам является аргументом) функции в packages.nix , поскольку с точки зрения Nix-языка процесс может вызвать или не вызвать функцию с набором, содержащим pkgs . Если это не так, к какому атрибуту вы относитесь, когда работаете with pkgs ?

    Вы также должны иметь многоточие, потому что функция может быть вызвана другими атрибутами, а не только pkgs .

    Почему в pkgs нет pkgs ? Вы можете получить его, но если вы не ссылаетесь на него нигде в файле, вы можете спокойно его опустить, так как эллипсис будет включать их в любом случае.

    Обновление атрибута путем вызова внешней функции

    Другим способом является создание функции, возвращающей набор с некоторым атрибутом, и значение этого атрибута, которое вы бы ввели в environment.systemPackages . Это ваша configuration.nix :

     { config, pkgs, ... }: { imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix ]; # SOME STUFF environment.systemPackages = import ./packages.nix pkgs; # SOME STUFF } 

    Ваши packages.nix :

     pkgs: with pkgs; [ emacs gitFull ] 

    import ./packages.nix pkgs означает: загрузить и вернуть выражение Nix в ./packages.nix а так как это функция, вызовите его с аргументом pkgs . with pkgs; [ emacs gitFull ] with pkgs; [ emacs gitFull ] – это выражение с выражением , оно возвращает область выражения до точки с запятой в выражение после точки с запятой. Без него это будет [ pkgs.emacs pkgs.gitFull ] .

    Interesting Posts

    Отображение переменной даты

    Каковы преимущества GRUB над LILO?

    svn switch –relocate: неправильный uuid?

    Список только обычных файлов (но не каталогов) в текущем каталоге

    Настройка раскладки клавиатуры: трехпозиционный переключатель, 3-й макет, когда CapsLock включен

    Скритичные разделы GPT с использованием разделенных

    скопировать (в X буфер обмена) ярлык в .tmux.conf

    Мониторинг данных последовательного порта между виртуальными портами

    В zsh, в чем смысл идиомы '$ == *'

    Qubes OS – обновление ядра шаблона

    Операция NFS COMMIT не используется, несмотря на использование fsync

    Как разбить файл на основе информации в столбце в Linux

    Человекообразные метки времени dmesg на OpenWRT

    Как проверить, установлена ​​ли моя графическая карта на Linux?

    Как открыть tty или выполнить какой-либо скрипт, когда ярлык Ctrl + Alt + F не работает, а X11 частично заморожен, но система все еще работает?

    Linux и Unix - лучшая ОС в мире.