Flake Schemas
Flake schemas are a mechanism to allow tools like nix flake show
and nix flake check
to enumerate and check the contents of a flake
in a generic way, without requiring built-in knowledge of specific flake output types like packages
or nixosConfigurations
.
A flake can define schemas for its outputs by defining a schemas
output. schemas
should be an attribute set with an attribute for
every output type that you want to be supported. If a flake does not have a schemas
attribute, Nix uses a built-in set of schemas (namely https://github.com/DeterminateSystems/flake-schemas).
A schema is an attribute set with the following attributes:
Attribute | Description | Default |
---|---|---|
version | Should be set to 1 | |
doc | A string containing documentation about the flake output type in Markdown format. | |
allowIFD | Whether the evaluation of the output attributes of this flake can read from derivation outputs. | true |
inventory | A function that returns the contents of the flake output (described below). |
Inventory
The inventory
function returns a node describing the contents of the flake output. A node is either a leaf node or a non-leaf node. This allows nested flake output attributes to be described (e.g. x86_64-linux.hello
inside a packages
output).
Non-leaf nodes must have the following attribute:
Attribute | Description |
---|---|
children | An attribute set of nodes. If this attribute is missing, the attribute is a leaf node. |
Leaf nodes can have the following attributes:
Attribute | Description |
---|---|
derivation | The main derivation of this node, if any. It must evaluate for nix flake check and nix flake show to succeed. |
evalChecks | An attribute set of Boolean values, used by nix flake check . Each attribute must evaluate to true . |
isFlakeCheck | Whether nix flake check should build the derivation attribute of this node. |
shortDescription | A one-sentence description of the node (such as the meta.description attribute in Nixpkgs). |
what | A brief human-readable string describing the type of the node, e.g. "package" or "development environment" . This is used by tools like nix flake show to describe the contents of a flake. |
Both leaf and non-leaf nodes can have the following attributes:
Attribute | Description |
---|---|
forSystems | A list of Nix system types (e.g. ["x86_64-linux"] ) supported by this node. This is used by tools to skip nodes that cannot be built on the user's system. Setting this on a non-leaf node allows all the children to be skipped, regardless of the forSystems attributes of the children. If this attribute is not set, the node is never skipped. |
Example
Here is a schema that checks that every element of the nixosConfigurations
flake output evaluates and builds correctly (meaning that it has a config.system.build.toplevel
attribute that yields a buildable derivation).
outputs = {
schemas.nixosConfigurations = {
version = 1;
doc = ''
The `nixosConfigurations` flake output defines NixOS system configurations.
'';
inventory = output: {
children = builtins.mapAttrs (configName: machine:
{
what = "NixOS configuration";
derivation = machine.config.system.build.toplevel;
}) output;
};
};
};