Skip to main content

Вложенные модули

Вложенные модули - это тип, позволяющий определять вложенные модули с собственным набором опций. Он используется для структурирования сложных конфигураций, группируя связанные опции в отдельный блок.

Работа вложенных модулей

При использовании lib.types.submodule вы создаёте новую опцию, значение которой будет набором атрибутов, соответствующих другому, вложенному модулю. Этот вложенный модуль имеет свой собственный набор опций, как и обычный модуль NixOS.

Пример:
Допустим, вы создаёте модуль для веб-сервиса, и хотите, чтобы опции для базы данных были сгруппированы.

  1. Объявление типа submodule:
    Вы определяете опцию database с типом submodule. Внутри submodule вы задаёте собственные опции, например, host, port и user.
    # module.nix
    { config, lib, ... }:
    
    let
      types = lib.types;
    in
    {
      options.database = lib.mkOption {
        type = types.submodule {
          options = {
            host = lib.mkOption {
              type = types.str;
              default = "localhost";
            };
            port = lib.mkOption {
              type = types.int;
              default = 5432;
            };
            user = lib.mkOption {
              type = types.str;
              default = "admin";
            };
          };
        };
        description = "Настройки для базы данных.";
      };
    }
  2. Использование в конфигурации:
    Затем в вашей конфигурации вы можете определить значения для этих вложенных опций.

    # configuration.nix
    { ... }:
    
    {
      imports = [
        ./module.nix
      ];
    
      database = {
        host = "db.example.com";
        port = 5433;
        user = "web_user";
      };
    }

     

В результате вы получите конфигурацию, где config.database.host будет "db.example.com", config.database.port будет 5433 и т.database.user будет "web_user".

Преимущества

  • Модульность: Позволяет разбивать сложные конфигурации на логические, повторно используемые блоки.
  • Структурирование: Повышает читаемость и удобство управления конфигурацией.
  • Типобезопасность: Каждая опция внутри submodule имеет свой тип и проверяется, что предотвращает ошибки конфигурации.
  • Совместимость с другими типами: Часто используется в сочетании с lib.types.attrsOf или lib.types.listOf для создания списков или наборов подмодулей. Например, можно создать listOf submodules для определения нескольких веб-сервисов с похожими настройками.