Development
This section describes how to properly import extensions. For examples of creating extensions, study the source code of existing extensions.
Importing
First, decide how many extensions and files you want to import.
If you have multiple extensions, or they are split across files:
nix
delib.callExtensions {
paths = [./foo ./default.nix]; # default: []
exclude = [./foo/test.nix]; # default: []
recursive = true; # default: true
}
# Returns an attrset where the keys are extension names and the values are the extensions themselves.
If you have a single extension represented by one file:
nix
delib.callExtension ./default.nix
# Returns a single extension.
Distributing
To make your extensions available for use in other flakes, add the denixExtensions
attrset to outputs
:
nix
outputs = {denix, ...}: {
denixExtensions = denix.lib.callExtensions {
paths = [./extensions];
};
};
You can also create a separate flake that contains only extensions:
nix
{
description = "Denix extensions collection";
inputs.denix.url = "github:yunfachi/denix";
outputs = {denix, ...}: {
denixExtensions = denix.lib.callExtensions {
paths = [./extensions];
};
};
}
You can use a template for this:
sh
nix flake init -t github:yunfachi/denix#extensions-collection
If you want to use denixExtensions
in the same flake that contains your configuration, refer to 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];};
};