Home Manager: Difference between revisions

From NixOS Wiki
imported>DavidDudson
m Missing Semicolon
imported>Grxnola
Adds how to use in a Flake
Line 47: Line 47:
</syntaxhighlight>
</syntaxhighlight>
It can either be incorporated in <code>/etc/nixos/configuration.nix</code> or be placed in a standalone file and imported in configuration.nix: <code>imports = [ ./thefile.nix ]</code>.
It can either be incorporated in <code>/etc/nixos/configuration.nix</code> or be placed in a standalone file and imported in configuration.nix: <code>imports = [ ./thefile.nix ]</code>.
To use it inside nixosConfigurations in a Flake, put home-manager in your inputs and in your configuration modules import <code>home-manager.nixosModules.home-manager</code>, then you can use it as above.


Whenever you change you home-manager configuration, you must rerun <code>nixos-rebuild switch</code>. With this method, changing the configuration of an unprivileged user requires to run a command as root.
Whenever you change you home-manager configuration, you must rerun <code>nixos-rebuild switch</code>. With this method, changing the configuration of an unprivileged user requires to run a command as root.

Revision as of 22:54, 29 June 2022

Home Manager is a system for managing a user environment using the Nix package manager. In other words, Home Manager lets you

  • install software declaratively in your user profile, rather than using nix-env
  • manage dotfiles in the home directory of your user.

Home Manager has many options, which can look daunting at first, but most of those options only boil down to creating some dotfile and installing some software in a way similar way to nix-env.

Note: Before attempting to use Home Manager please read the warning.

Configuration

Home Manager can be configured as a user in ~/.config/nixpkgs/home.nix or as a module inside configuration.nix.

Installation as a user

Follow the official guide

Your configuration is stored in ~/.config/nixpkgs/home.nix. Each time you modify it, rerun home-manager switch for changes to have effect.

Note that to work correctly, home-manager needs your shell to source ~/.nix-profile/etc/profile.d/hm-session-vars.sh. The most convenient way to do so it to have home-manager manage your whole shell configuration, eg programs.bash.enable = true; or programs.zsh.enable = true;. But in this case your whole bashrc is managed with Home Manager: the years of customization you accumulated in your former .bashrc must be migrated to Home Manager options, which may take some time. The quick and dirty way to do the migration is to move your bashrc to some other location and source it from Home Manager:

{ pkgs, ...}: {
  programs.bash = {
    enable = true;
    bashrcExtra = ''
      . ~/oldbashrc
    '';
  };
}

Usage as a NixOS module

Here is a nixos module template you can use:

{ config, pkgs, ... }:
let
  home-manager = builtins.fetchTarball "https://github.com/nix-community/home-manager/archive/master.tar.gz";
in
{
  imports = [
    (import "${home-manager}/nixos")
  ];

  home-manager.users.my_username = {
    /* Here goes your home-manager config, eg home.packages = [ pkgs.foo ]; */
  };
}

It can either be incorporated in /etc/nixos/configuration.nix or be placed in a standalone file and imported in configuration.nix: imports = [ ./thefile.nix ].

To use it inside nixosConfigurations in a Flake, put home-manager in your inputs and in your configuration modules import home-manager.nixosModules.home-manager, then you can use it as above.

Whenever you change you home-manager configuration, you must rerun nixos-rebuild switch. With this method, changing the configuration of an unprivileged user requires to run a command as root.

Usage

Using Home Manager as a declarative version of nix-env

Nix-env has problematic behavior due to its imperative nature. For example, after installing java 8 with nix-env -i jdk8, running nix-env --upgrade upgrades java to 10 despite the fact that we initially explicitly requested java 8.

Installing software with Home-manager avoids this problem:

{ pkgs, ...}: {
  home.packages = [ pkgs.jdk8 ];
}

It is a perfectly valid use case for home-manager to only install software with home.packages without managing dotfiles at all.

Usage on non-NixOS Linux

Home Manager has an option to automatically set some environment variables that will ease usage of software installed with nix on non-NixOS linux (fixing local issues, settings XDG_DATA_DIRS, etc.):

{ pkgs, ...}: {
  targets.genericLinux.enable = true;
}

Managing your dotfiles

Home Manager has options to configure many common tools. As an example, adding the following

  programs.git = {
    enable = true;
    userName  = "my_git_username";
    userEmail = "my_git_username@gmail.com";
  };

will make Home Manager generate a .config/git/config file for you.

Even for programs for which Home Manager doesn't have configuration options, you can use it to manage your dotfiles directly, e.g.

  xdg.configFile."i3blocks/config".source = ./i3blocks.conf;
  home.file.".gdbinit".text = ''
      set auto-load safe-path /nix/store
  '';

This will create symlink $XDG_CONFIG_HOME/i3blocks/config and ~/.gdbinit.

You have the whole list of the options available in home-manager here

Examples

FAQ

I cannot set GNOME themes via home-manager

You will have to add

programs.dconf.enable = true;

to your system configuration. ( Source )

Installed apps don’t show up in Ubuntu's/GNOME's "Show Applications"

Consider some of the workarounds here: https://github.com/nix-community/home-manager/issues/1439.

Alternatives

  • Wrappers vs. Dotfiles shows how (per-user) wrapper scripts can be used in place of dotfiles in the user's home directory

See also