[home manager] [solved] Is there a way to automatically import all .nix files in a directory?
My solution:
let
nixFilesInDirectory = directory:
(
map (file: "${directory}/${file}")
(
builtins.filter
(
nodeName:
(builtins.isList (builtins.match ".+\.nix$" nodeName)) &&
# checking that it is NOT a directory by seeing
# if the node name forcefully used as a directory is an invalid path
(!builtins.pathExists "${directory}/${nodeName}/.")
)
(builtins.attrNames (builtins.readDir directory))
)
);
nixFilesInDirectories = directoryList:
(
builtins.concatMap
(directory: nixFilesInDirectory directory)
(directoryList)
);
# ...
in {
imports = nixFilesInDirectories ([
"${./programs}"
"${./programs/terminal-niceties}"
]);
# ...
}
base script: comment on "getting all configs from folder" (Reddit)
Started developing from that piece that implements the general idea with only builtin functions, so I tried as best I could to stick to the builtins
isDir: nixpkgs (GitHub)
Used to filter out directories from the items to be included
I'm trying out Nix Home Manager and learning its features little by little.
I've been trying to split my app configurations into their own files now and saw that many do the following:
Make a directory containing all the app specific configurations:
programs/
└── helix.nix
Make a catch-all file default.nix that selectively imports the files inside:
programs/
├── default.nix
└── helix.nix
Content:
{
imports = [
./helix.nix
];
}
Import the directory (picking up the default.nix) within the home-manager configuration:
{
# some stuff...
imports = [
./programs
];
# some other stuff...
}
I'd like to avoid having to write each and every file I'll create into the imports of default.nix, that kinda defeats the point of separating it if I'll have to specify everything anyway, so is there a way to do so? I haven't found different ways to do this in various Nix discussions.
Haha, I read this just after trying to figure it out on my own and it seems the solution is kind of similar to what I got, but this looks like it's probably more robust since it extracts it all into a function (though I have yet to understand the syntax 👀). So thanks, I'll be trying that as well!