Is it possible to create a flake output for each item in a list, sort of like this:
{
description = "Nixos config flake";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
};
outputs = { self, nixpkgs, ... }:
let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
configs = [ "cfg1" "cfg2" ];
in
{
for-each configs (config:
nixosConfigurations."${config}" = nixpkgs.lib.nixosSystem {
modules = [
"./hosts/${config}/configuration.nix"
];
};
)
};
}
?
You could use a combination of map
and builtins.listToAttrs
:
{
description = "A very basic flake";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
};
outputs =
{ self, nixpkgs }:
let
configs = [
"cfg1"
"cfg2"
];
in
{
nixosConfigurations = builtins.listToAttrs (
map
(config: {
name = config;
value = nixpkgs.lib.nixosSystem { modules = [ "./hosts/${config}/configuration.nix" ]; };
})
configs
);
};
}
Results in:
nix flake show
path:/tmp/tmp.OHbGpYu8ws?lastModified=1709932531&narHash=sha256-j%2BBBFEicTYrzWSBPBc3LuDBRdDhf7p3DXTMgdDR544Q%3D
└───nixosConfigurations
├───cfg1: NixOS configuration
└───cfg2: NixOS configuration
Or, lib.pipe
if you want the configs
first:
{
description = "A very basic flake";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
};
outputs =
{ self, nixpkgs }:
let
configs = [
"cfg1"
"cfg2"
];
inherit (nixpkgs) lib;
in
{
nixosConfigurations = lib.pipe configs [
(map (
config: {
name = config;
value = lib.nixosSystem { modules = [ "./hosts/${config}/configuration.nix" ]; };
}
))
builtins.listToAttrs
];
};
}
2 Likes