Skip to content

devenv 1.1: Nested Nix outputs using the module system

devenv 1.1 brings support for Nix outputs, matching the last missing piece of functionality with Flakes.

It was designed to make outputs extensible, nested, and buildable as a whole by default.

This allows exposing Nix packages for installation/consumption by other tools.

If you have a devenv with outputs like this:

devenv.nix
{ pkgs, ... }: {
outputs = {
myproject.myapp = import ./myapp { inherit pkgs; };
git = pkgs.git;
};
}

You can build all outputs by running:

Terminal window
$ devenv build
/nix/store/mzq5bpi49h26cy2mfj5a2r0q69fh3a9k-git-2.44.0
/nix/store/mzq5bpi49h26cy2mfj5a2r0q71fh3a9k-myapp-1.0

Or build specific attribute(s) by listing them explicitly:

Terminal window
$ devenv build outputs.git
/nix/store/mzq5bpi49h26cy2mfj5a2r0q69fh3a9k-git-2.44.0

This is useful for tools that need to find and install specific outputs.

By default, any derivation specified in outputs nested attributes set is recognized as an output.

You can define custom options as output types in devenv. These will be automatically detected and built:

devenv.nix
{ pkgs, lib, config, ... }: {
options = {
myapp.package = lib.mkOption {
type = config.lib.types.outputOf lib.types.package;
description = "The package for myapp";
default = import ./myapp { inherit pkgs; };
defaultText = "myapp-1.0";
};
};
config = {
outputs.git = pkgs.git;
}
}

Building will pick up all outputs, in this case myapp.package and outputs.git:

Terminal window
$ devenv build
/nix/store/mzq5bpi49h26cy2mfj5a2r0q69fh3a9k-myapp-1.0
/nix/store/mzq5bpi49h26cy2mfj5a2r0q69fh3a9k-git-2.44.0

If you don’t want to specify the output type, you can just use config.lib.types.output.

If you import another devenv.nix file, the outputs will be merged together, allowing you to compose a developer environment and outputs in one logical unit.

You could also import outputs from other applications as inputs instead of composing them.

Leave a thumbs on the issue if you’d like to see it happen.

See Outputs section in documentation for the latest comprehensive guide to outputs.

We’re on Discord if you need help, Domen