Is it possible to layer multiple profiles together?

nix-env has the capability to operate on different profiles, and to switch between them. I admit I’ve never really understood the point of this given that switching profiles affects my entire user instead of the just the current shell.

But today I had a thought: is there any way to construct a single profile that layers several other profiles together?

I want to do this because I have a command nix-rebuild set up that uses nix-env -i --remove-all to replace all of my installed packages with a brand new set, to mimic nixos-rebuild. But right now I’m struggling with the desire to manually build a tool using nix-shell and then installing that in my profile (the reason being I want to install in-development versions of a tool). I could absolutely do that, except this custom build will be thrown away the next time I run nix-rebuild. And I can’t just whip up a derivation for this unless I want to be constantly editing this derivation to point at new commits.

So I had the thought, if I could layer multiple profiles together, then I could have nix-rebuild operate on a sort of “base” profile and then layer on top a separate “custom” profile that I can manipulate with nix-env. This way I can continue to use nix-env manually and nix-rebuild won’t interfere.

But I’m not sure this is practical to do. It looks like nix-env -i has a --from-profile flag that lets me copy store paths from one profile to another, so in theory I could do something like nix-env -i --remove-all --from-profile /path/to/base/profile '.*' && nix-env -i --preserve-installed --from-profile /path/to/customized/profile '.*', but this is not atomic. I haven’t actually tested this to even figure out if it would work at all, but the fact that it’s not atomic is worrying.

Has anyone else tried to do something like this?

1 Like

Well… and do you even need anything beyond another item in $PATH, e.g. pointing to /nix/var/nix/profiles/per-user/$USER/someName? You can put in multiple profiles like this, and order them to give them priorities.

1 Like

What, just hard-code the separate profile in my PATH? That… actually should work just fine.

1 Like