nixos module: install user packages through NixOS

We cannot guarantee that the Nix store will be writable during startup
so installing the user packages through `nix-env -i` may fail.
Therefore, when building through the NixOS module install through the
`users.users.<name?>.packages` option.
This commit is contained in:
Robert Helgesson 2017-12-19 15:43:40 +01:00
parent a3462daeb1
commit 127e28c7d8
No known key found for this signature in database
GPG key ID: 36BDAA14C2797E89
2 changed files with 29 additions and 3 deletions

View file

@ -307,9 +307,31 @@ in
home.activation.writeBoundary = dag.entryAnywhere "";
# Install packages to the user environment.
home.activation.installPackages = dag.entryAfter ["writeBoundary"] ''
$DRY_RUN_CMD nix-env -i ${cfg.path}
'';
#
# Note, if we are running as a NixOS module then we cannot rely on
# `nix-env -i` because our target may not allow modification of
# the Nix store. We will instead use the
# `users.users.<name?>.packages` NixOS option. We still need this
# activation command, however, since some modules need to ensure
# that their activation commands are run after packages are
# guaranteed to be installed.
#
# In case the user has moved from a user-install of Home Manager
# to one managed through the NixOS module we attempt to uninstall
# the `home-manager-path` package if it is installed.
home.activation.installPackages = dag.entryAfter ["writeBoundary"] (
if config.submoduleSupport.enable
then
''
if nix-env -q | grep '^home-manager-path$'; then
nix-env -e home-manager-path
fi
''
else
''
$DRY_RUN_CMD nix-env -i ${cfg.path}
''
);
home.activationPackage =
let

View file

@ -30,6 +30,10 @@ in
};
config = mkIf (cfg.users != {}) {
users.users = mapAttrs (username: usercfg: {
packages = usercfg.home.packages;
}) cfg.users;
systemd.services = mapAttrs' (username: usercfg:
nameValuePair ("home-manager-${utils.escapeSystemdPath username}") {
description = "Home Manager environment for ${username}";