Введение в опции Denix
Опции Denix представляют собой обёртку для lib.mkOption
. Это означает, что любую опцию Denix можно создать, используя стандартный lib.mkOption
, и использование опций Denix является необязательным.
Зачем использовать опции Denix?
Использование lib.mkOption
может быть громоздким, и каждый раз писать что-то вроде:
lib.mkOption {type = lib.types.listOf lib.types.str; default = [];}
- неудобно, особенно когда опции в вашей конфигурации используются повсеместно. Вместо этого можно написать более лаконично:
delib.listOfOption delib.str []
Таким образом, вместо создания опции через указание всех параметров, можно использовать функции Denix для более читабельного и аккуратного кода.
Принцип работы
Функции, связанные с опциями, делятся на четыре основных типа:
Создание опции с типом N
*Option <default>
- например,strOption "foo"
.*OfOption <secondType> <default>
- например,listOfOption str ["foo" "bar"]
.*ToOption <secondType> <default>
- например,lambdaToOption int (x: 123)
.
Добавление к типам опции X тип N
allow* <option>
- например,allowStr ...
.allow*Of <secondType> <option>
- например,allowListOf str ...
.allow*To <secondType> <option>
- например,allowLambdaTo int ...
.
Прямое изменение attribute set опции
noDefault <option>
- удаляет атрибутdefault
из опции. Используется редко, так как редко бывают опции без значения по умолчанию.readOnly <option>
- добавляет атрибутreadOnly
со значениемtrue
.apply <option> <apply>
- добавляет атрибутapply
с переданным значением.description <option> <description>
- добавляет атрибутdescription
с переданным значением.
Генерация конкретной опции/опций
singleEnableOption <default> {name, ...}
- создаёт attribute set с помощью выраженияdelib.setAttrByStrPath "${name}.enable" (boolOption default)
. Обычно это используется вdelib.module :: options
, с её передаваемыми аргументами, поэтому достаточно написать:nixoptions = delib.singleEnableOption <default>;
Список актуальных опций можно найти в исходном коде: github:yunfachi/denix?path=lib/options.nix
Примеры
Denix | lib.mkOption |
---|---|
portOption 22 | mkOption {type = types.port; default = 22;} |
noDefault (portOption null) | mkOption {type = types.port;} |
allowNull (portOption null) | mkOption {type = types.nullOr types.port; default = null;} |
allowStr (portOption "22") | mkOption {type = types.strOr types.port; default = "22";} |
listOfOption port [] | mkOption {type = types.listOf types.port; default = [];} |
readOnly (noDefault (portOption null)) | mkOption {type = types.port; readOnly = true;} |
singleEnableOption true {name = "git";} | git.enable = mkEnableOption "git" // {default = true;} |
(Обычно
{name = "git";}
указывать не требуется, так как эта функция в основном используется вdelib.module :: options
)