Scopes
A "scope", in the optnix context, is a combination of a module system option
list, as well as a module system instantiation.
For example, a "scope" for a NixOS configuration located at the flake ref
github:water-sucks/nixed#nixosConfigurations.CharlesWoodson would be:
- The module system's
optionsset (nixosConfigurations.CharlesWoodson.options) - The module system's
configset (nixosConfigurations.CharlesWoodson.config)
options would be used to generate the option list, while config would be
used to evaluate and preview values of those options.
Components
In optnix, scopes are defined from the configuration file, and have a few
components.
An example of the fields for a scope in optnix can be found on the
configuration page, and real configuration examples can be
found on the recipes page.
scopes.<name>.description
A small description of what the purpose of this scope is. Optional, but useful for command-line completion and listing scopes more descriptively.
scopes.<name>.options-list-{file,cmd}
The option list can be specified in two different ways:
- A path to a JSON file containing the option list (
options-list-file) - A command that prints the option list to
stdout(options-list-cmd)
Specifying at least one of these two is mandatory for every scope.
options-list-file is preferred over options-list-cmd, but both can be
specified; if the file does not exist or cannot be accessed/is incorrect, then
the command is used as a fallback.
The command will usually end up being some invocation of Nix, but this command
is evaluated using a shell (/bin/sh), which means it supports POSIX shell
constructs/available commands as long as they are in $PATH.
Prefer using options-list-file when creating configurations, since this is
almost always faster than running the equivalent options-list-cmd, since
options-list-cmd is not cached.
Generating options list files can be done using the optnix Nix library, and
examples can be seen on the recipes page.
scopes.<name>.evaluator
An evaluator is a command template that can be used to evaluate a Nix configuration to retrieve values.
It is a shell command (always some invocation of a Nix command), but with a
twist: exactly one placeholder of {{ .Option }} for the option to evaluate is
required. This will be filled in with the option to evaluate.
An example evaluator for a Nix flake would be:
nix eval "/path/to/flake#nixosConfigurations.nixos.config.{{ .Option }}"
Specifying an evaluator for a scope is optional.