Create flake output for each item in list

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