🦈

home-manager の再現性を高める - nix-channel から Flakes ベースの運用へ

に公開

本記事は Nix Advent Calendar 2025 3 日目の記事です。

https://adventar.org/calendars/11657

はじめに

home-manager は Nix を利用したユーザー環境管理ツールです。

公式ドキュメントのインストール手順では「nix-channel」を用いた方法が最初に紹介されています。
standard way と紹介されているため、この方法で導入している方も一定いるかと思います

In this chapter we describe how to install Home Manager in the standard way using channels. If you prefer to use Nix Flakes then please see the instructions in nix flakes.

https://nix-community.github.io/home-manager/index.xhtml#ch-installation

私が最初に home-manager を導入したときは、nix-channel ベースでセットアップしました。

しかし、この方法では導入される各ツールのバージョンが nix-channel --update を実行したタイミングに依存するため、異なる PC 間でバージョンが揃わないという問題に直面しました。
言い換えると、CLI での手動操作によってバージョンが左右されてしまい、依存関係のリビジョンを Git で厳密に管理できない状態でした。

そのため、自分にとって「別の PC で同じ環境を再現する」という意味での再現性があまり良くないと感じました。

この問題は Nix Flakes を利用すれば、ロックファイル(flake.lock)によって手軽に解決できます
私は普段から Flakes の devShell で開発環境を作っていることもあり、home-manager も Flakes 管理へ移行することにしました。

本記事では、その移行過程を紹介します。

想定読者

  • home-manager を nix-channel でインストールした方
  • Flakes での管理に興味がある方
  • nix-channel を用いた管理は宣言的でない / 再現性が足りないと感じている方

検証環境

  • Windows 11
    • WSL2 Ubuntu 22.04.5 LTS
  • nix (Determinate Nix 3.8.2) 2.30.1
    • Flakes 機能を有効化済み
  • nix-channel を利用した Standalone installation で home-manager を導入済み

参考資料

  • 公式ドキュメント - Nix Flakes / Standalone setup

https://nix-community.github.io/home-manager/index.xhtml#ch-nix-flakes

移行前の状態を確認

bash
$ home-manager --version
25.11-pre

$ nix-channel --list
home-manager https://github.com/nix-community/home-manager/archive/master.tar.gz

$ which home-manager
/home/ryu/.nix-profile/bin/home-manager

$ head -n 1 /home/ryu/.nix-profile/bin/home-manager
#!/nix/store/fdjz8wqw1yfh3pb58vrsswc30qwz42mx-bash-interactive-5.3p3/bin/bash

Flakes 機能の有効化

Determinate Systems のインストーラーで Nix を導入した方は不要な作業です。

bash
nix.settings.experimental-features = "nix-command flakes";

https://nix-community.github.io/home-manager/index.xhtml#sec-flakes-prerequisites

home.nix の作成

home-manager を利用している方は既にあるはずなので不要な作業です。

flake.nix の作成

以下のコマンドで、~/.config/home-manager/home.nixflake.nix が無い場合、ファイルが生成されます。

bash
nix run home-manager/master -- init

以下は生成されるファイル例です。
system(x86_64-linux)や user(ryu)を自動で記入してくれます
そのまま使える状態のはずです。

flake.nix
{
  description = "Home Manager configuration of ryu";

  inputs = {
    # Specify the source of Home Manager and Nixpkgs.
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs =
    { nixpkgs, home-manager, ... }:
    let
      system = "x86_64-linux";
      pkgs = nixpkgs.legacyPackages.${system};
    in
    {
      homeConfigurations."ryu" = home-manager.lib.homeManagerConfiguration {
        inherit pkgs;

        # Specify your home configuration modules here, for example,
        # the path to your home.nix.
        modules = [ ./home.nix ];

        # Optionally use extraSpecialArgs
        # to pass through arguments to home.nix
      };
    };
}

環境を有効化

flake.nixgit add してから、以下のコマンドを実行します。

bash
nix run home-manager/master -- init --switch

以降は、いつも通りのコマンドで環境を更新できます。

bash
home-manager switch

移行後の状態を確認

Flake でのインストールに伴い home-manager のバージョンが変わったので差分が分かりやすかったです。
nix-channel --update をここ最近していなかっただけ)

nix-channel に登録した home-manager は不要となったので、次のセクションで掃除します。

bash
$ home-manager --version
26.05-pre

$ nix-channel --list
home-manager https://github.com/nix-community/home-manager/archive/master.tar.gz

$ which home-manager
/home/ryu/.nix-profile/bin/home-manager

$ head -n 1 /home/ryu/.nix-profile/bin/home-manager
#!/nix/store/35yc81pz0q5yba14lxhn5r3jx5yg6c3l-bash-interactive-5.3p3/bin/bash

後片付け

bash
nix-channel --remove home-manager

これで作業は完了です。

おわりに

本記事では、home-manager を nix-channel で導入していた環境から、Flakes ベースの運用へ移行する手順を紹介しました。

「いつ nix-channel --update したか」に依存した運用から、flake.lock によって依存バージョンが固定され、Git 管理可能な運用になりました。

Flakes を利用すれば「pin する仕組み」が標準機能として手に入るため、複数マシンで同じ環境を維持したい場合には、Flakes ベースにするメリットは大きいと感じました

また、本記事では扱いませんが、異なるシステム間の設定を 1 つの dotfiles レポジトリで管理する場合、Flakes の方がきれい(主観)に管理できました。
flake.nix で利用している homeConfigurations."username" がとても便利です。

機会があればこちらも記事にしたいと思います。

Discussion