Autowiring

An optional autowiring module is provided that will scan the directory structure and wire up the appropriate flake outputs automatically without you having to do it manually.

A ready demonstration is available in nixos-unified-template as well as srid/nixos-config. In the latter, you will notice the following directory structure:

โฎ lsd --tree --depth 1 configurations modules overlays packages
๐Ÿ“ configurations
โ”œโ”€โ”€ ๐Ÿ“ darwin
โ”œโ”€โ”€ ๐Ÿ“ home
โ””โ”€โ”€ ๐Ÿ“ nixos
๐Ÿ“ modules
โ”œโ”€โ”€ ๐Ÿ“ darwin
โ”œโ”€โ”€ ๐Ÿ“ flake-parts
โ”œโ”€โ”€ ๐Ÿ“ home
โ””โ”€โ”€ ๐Ÿ“ nixos
๐Ÿ“ overlays
โ””โ”€โ”€ โ„๏ธ default.nix
๐Ÿ“ packages
โ”œโ”€โ”€ โ„๏ธ git-squash.nix
โ”œโ”€โ”€ โ„๏ธ sshuttle-via.nix
โ””โ”€โ”€ ๐Ÿ“ twitter-convert

Each of these are wired to the corresponding flake output, as indicated in the below table:

DirectoryFlake Output
configurations/nixos/foo.nix1nixosConfigurations.foo
configurations/darwin/foo.nix1darwinConfigurations.foo
configurations/home/foo.nix1legacyPackages.${system}.homeConfigurations.foo2
modules/nixos/foo.nixnixosModules.foo
modules/darwin/foo.nixdarwinModules.foo
modules/flake-parts/foo.nixflakeModules.foo
overlays/foo.nixoverlays.foo

flake-parts

Autowiring is also provided if you use just flake-parts, via the lib.mkFlake function. In your top-level flake.nix, you only need to define your outputs as follows:

{
  inputs = ...;
  outputs = inputs:
    inputs.nixos-unified.lib.mkFlake
      { inherit inputs; root = ./.; };
}

This will,

  • Auto-import flake-parts modules under either ./nix/modules/flake-parts or ./modules/flake-parts (whichever exists)
  • Use a sensible default for systems which can be overriden.
  • Pass root as top-level module args, as a non-recursive way of referring to the path of the flake (without needing inputs.self).

See srid/haskell-templateโ€™s flake.nix for a ready example. For another example, see this emanote PR.

1

This path could as well be configurations/nixos/foo/default.nix. Likewise for other output types.

2

Why legacyPackages? Because, creating a home-manager configuration requires pkgs. See https://github.com/nix-community/home-manager/issues/3075