Skip to content

Разработка

В этом разделе описано, как правильно импортировать расширения. Для примеров создания расширений изучите исходный код существующих расширений.

Импортирование

Для начала определитесь, сколько расширений и файлов вы хотите импортировать.

Если расширений несколько, или они разбиты на файлы:

nix
delib.callExtensions {
  paths = [./foo ./default.nix]; # по умолчанию: []
  exclude = [./foo/test.nix];    # по умолчанию: []
  recursive = true;              # по умолчанию: true
}
# Возвращает attrset, где ключи - это имена расширений, а значения - сами расширения.

Если расширение одно и представляет собой один файл:

nix
delib.callExtension ./default.nix
# Возвращает одно расширение.

Распространение

Чтобы предоставить свои расширения для использования в других флейках, добавьте в outputs attrset denixExtensions:

nix
outputs = {denix, ...}: {
  denixExtensions = denix.lib.callExtensions {
    paths = [./extensions];
  };
};

Можно также создать отдельный флейк, содержащий только расширения:

nix
{
  description = "Denix extensions collection";

  inputs.denix.url = "github:yunfachi/denix";

  outputs = {denix, ...}: {
    denixExtensions = denix.lib.callExtensions {
      paths = [./extensions];
    };
  };
}

Для этого можно использовать шаблон:

sh
nix flake init -t github:yunfachi/denix#extensions-collection

Если вы хотите использовать denixExtensions в том же флейке, где находится конфигурация, обращайтесь к self:

nix
outputs = {denix, self, ...}: let
  mkConfigurations = moduleSystem:
    # ...
    denix.lib.configurations {
      extensions = with denix.lib.extensions; with self.denixExtensions; [
        args # denix.lib.extensions
        awesomeExtension # self.denixExtensions
      ];
    };
in {
  denixExtensions = denix.lib.callExtensions {paths = [./extensions];};
};