Expression for a buildEnv-based declarative user environment
This is one way of managing your user profile declaratively.
Alternatives include:
- an attrset-based
nix-env
-based environment, installed usingnix-env -ir
rather thannix-env --set
. LnL has an overlay which shows a way of doing this. - home-manager, which provides NixOS-like config for your
$HOME
Note that this is incompatible with regular imperative use of nix-env
, e.g. nix-env -iA nixpkgs.hello
. It has the advantage of allowing the installation of multiple outputs of the same package much better than nix-env
's builtin profile builder does.
I personally currently use home-manager.
Feature comparison:
nix-env
(nix-env -iA nixpkgs.hello
)
Prevents imperative use of - buildEnv
✔️ - buildEnv takes responsibility for the entire user profile, meaning that nix's builtin env builder cannot modify it
- attrset
❌ - the attrset approach leaves building the profile up to
nix-env
, which allows adding packages ad-hoc (though they will be removed on the next profile build) usingnix-env -i
- the attrset approach leaves building the profile up to
- home-manager
❌ - home-manager installs a single
buildEnv
into the user profile, remaining compatible with imperative/impurenix-env
- home-manager installs a single
~/.nix-profile
Management of files outside - buildEnv
❌ - attrset
❌ - home-manager
✔️
Declarative config like NixOS
- buildEnv
❌ - attrset
❌ - home-manager
✔️
Gives good control over outputs installed
- buildEnv
✔️ - attrset
❌ - home-manager
❓
Sorry if it's a stupid question but what actually are the disadvantages/advantages of these different approaches?