🏡

HomeManager+Nixでdotfilesに再現性を持たせよう

に公開

Home Managerとは

Home Managerはユーザー環境をNixで管理するためのソフトウェアです。Home Manager自体はNixOS以外(Ubuntu, Arch, macOSなど)でも使用できます。

Home Managerの利点

ユーザー単位でパッケージ管理ができることはもちろんですが、Home Managerの最も素晴らしいところはdotfilesを全てNix言語で宣言的に管理できるところにあると私は思っています。

例えば、bashのaliasを指定する場合、従来のように.bashrcにスクリプトを書くのではなく、以下のようにNix式として記述できます。

programs.bash = {
  enable = true;
  shellAliases = {
    g = "git";
    "..." = "cd ../..";
  };
};

既存の.bashrcを使用したい場合は以下のように簡単に記述することもできます。

home.packages = [
    pkgs.bash
    ...
];

home.file = {
    ".bashrc".source = ./.bashrc;
};

sourceにURLを指定することもできます。その場合は、再現性を保持するためにハッシュ値を指定する必要があります。

ハッシュ値の取得めんどくない?

実際面倒くさいですが、sha256 = ""のようにから文字列を入れておくと、エラーメッセージで正しいハッシュ値を教えてくれます。

$ home-manager switch # または nixos-rebuild switch
...
error: hash mismatch in fixed-output derivation '/nix/store/wq0ms9363i88kcysxr553092vkish7gi-catppuccin-powerline.toml.drv':
         specified: sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
            got:    sha256-z4gMhCgYllOHgYTwn7mIo5WzVQZqt7RsHibmu0D/qC0=
home.file = {
    ...
    ".config/starship.toml".source = pkgs.fetchurl {
      url = "https://starship.rs/presets/toml/catppuccin-powerline.toml";
      sha256 = "sha256-z4gMhCgYllOHgYTwn7mIo5WzVQZqt7RsHibmu0D/qC0=";
    };
};

この場合、.bashrc.config/starship.tomlは読み取り専用状態になるので、外部から勝手にファイルを変更される恐れはありません。
これによって完全に再現可能な環境を構築することができます。

NixOSと併用する利点

NixOS+Home ManagerならほとんどをNix言語で管理することができます。
HyprlandなどのWaylandコンポジタの設定は非常に難しいですが、Nixで型を付けて管理することができるのでかなり簡単に触ることができますね。
https://home-manager-options.extranix.com/?query=hyprland

これは一例ですが、hyprlandの設定をNixで記述でき、HomeManagerが自動的にhyprland.confに変換してくれます。

wayland.windowManager.hyprland = {
    enable = true;
    xwayland.enable = true;
    systemd.enable = true;

    settings = {
      decoration = {
        rounding = 10;

        blur = {
          enabled = true;
          size = 3;
          passes = 1;
          vibrancy = 0.1696;
        };

        shadow = {
          enabled = true;
          range = 4;
          render_power = 3;
          color = "rgba(1a1a1aee)";
        };
      };
      ...
};

試してみたくなった!どうすれば良い?

ぜひ好きなOSにHomeManagerを入れて試してみてください!最初は以下の記事がわかりやすいです。
https://zenn.dev/kuu/articles/20250204_introduce-home-manager

HomeManagerのOption(programs.*)を検索するには以下のサイトがおすすめです。
https://home-manager-options.extranix.com/

Discussion