Why Modules?¶
Declaring derivations as modules solves a number of issues.
For some more background information, check out the initial exploration of this idea at DavHau/pkgs-modules.
@edolstra 's talk about this topic is also worth watching.
Benefits¶
Deprecate override functions¶
Changing options of packages in nixpkgs can require chaining different override functions like this:
{
htop-mod = let
htop-overridden = pkgs.htop.overrideAttrs (old: {
pname = "htop-mod";
});
in
htop-overridden.override (old: {
sensorsSupport = false;
});
}
... while doing the same using dream2nix
looks like this:
{
htop-mod = {
imports = [./htop.nix];
name = lib.mkForce "htop-mod";
flags.sensorsSupport = false;
};
}
See htop module definition here.
Type safety¶
The following code in nixpkgs mkDerivation mysteriously skips the patches:
... while doing the same using dream2nix
raises an informative type error:
Catch typos¶
The following code in nixpkgs mkDerivation builds without openssl_3.
... while doing the same using dream2nix
raises an informative error:
Environment variables clearly defined¶
dream2nix
requires a clear distinction between known parameters and user-defined variables.
Defining SOME_VARIABLE
at the top-level, would raise:
Instead it has to be defined under env.
:
Documentation / Discoverability¶
No more digging the source code to find possible options to override.
Documentation similar to search.nixos.org can be generated for packages declared via dream2nix
.
Every package built with dream2nix
has a .docs
attribute that builds an html documentation describing it's options.
Package blueprints¶
With dream2nix
, packages don't need to be fully declared. Options can be left without defaults, requiring the consumer to complete the definition.
Flexibility¶
The nixos module system gives maintainers more freedom over how packages are split into modules. Separation of concerns can be implemented more easily. For example, the dependency tree of a package set can be factored out into a separate module, allowing for simpler modification.