home-manager の再現性を高める - nix-channel から Flakes ベースの運用へ
本記事は Nix Advent Calendar 2025 3 日目の記事です。
はじめに
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.
私が最初に 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
移行前の状態を確認
$ 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 を導入した方は不要な作業です。
nix.settings.experimental-features = "nix-command flakes";
home.nix の作成
home-manager を利用している方は既にあるはずなので不要な作業です。
flake.nix の作成
以下のコマンドで、~/.config/home-manager/ に home.nix と flake.nix が無い場合、ファイルが生成されます。
nix run home-manager/master -- init
以下は生成されるファイル例です。
system(x86_64-linux)や user(ryu)を自動で記入してくれます。
そのまま使える状態のはずです。
{
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.nix を git add してから、以下のコマンドを実行します。
nix run home-manager/master -- init --switch
以降は、いつも通りのコマンドで環境を更新できます。
home-manager switch
移行後の状態を確認
Flake でのインストールに伴い home-manager のバージョンが変わったので差分が分かりやすかったです。
(nix-channel --update をここ最近していなかっただけ)
nix-channel に登録した home-manager は不要となったので、次のセクションで掃除します。
$ 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
後片付け
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