nix-darwin環境でのHome Managerモジュール活用術

モジュール統合の全体像

nix-darwin上でユーザー環境を宣言的に管理する場合、独立したHome Manager実行ではなく、darwin-configuration.nixから直接モジュールを呼び出すアプローチが推奨される。この方式ではシステム構築とユーザー環境の構築が単一の評估サイクルで完結し、一貫性と再現性が向上する。

セットアップ手順

Flakesを使わない場合のチャネル登録

従来のチャネルベース運用では、nix-darwinのチャネルに合わせてHome Managerのチャネルも固定する。

# nixpkgs unstable追従時
nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz hm
nix-channel --update hm

# 25.05系追従時
nix-channel --add https://github.com/nix-community/home-manager/archive/release-25.05.tar.gz hm
nix-channel --update hm

Flakes対応推奨設定

現代的な構成ではflake.nix内で直接入力を宣言する。

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    darwin = {
      url = "github:LnL7/nix-darwin";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { self, nixpkgs, darwin, home-manager, ... }@attrs:
    let
      hostParams = { system = "aarch64-darwin"; pkgs = nixpkgs.legacyPackages.aarch64-darwin; };
    in
    {
      darwinConfigurations.workstation = darwin.lib.darwinSystem {
        inherit (hostParams) system pkgs;
        modules = [
          home-manager.darwinModules.home-manager
          ./hosts/workstation/default.nix
        ];
      };
    };
}

実用的な構成パターン

単一ユーザー構成

最もシンプルな形態。ユーザーaliceの環境を構築する例。

{ pkgs, ... }:

{
  users.knownUsers = [ "alice" ];
  users.users.alice = {
    uid = 501;
    home = "/Users/alice";
    shell = pkgs.zsh;
  };

  home-manager = {
    useGlobalPkgs = true;
    useUserPackages = true;
    
    users.alice = { config, lib, ... }: {
      imports = [ ./modules/shell ./modules/devtools ];
      
      home = {
        username = "alice";
        homeDirectory = lib.mkForce "/Users/alice";
        stateVersion = "25.05";
      };

      programs.git = {
        enable = true;
        userName = "Alice";
        userEmail = "alice@example.com";
      };
    };
  };
}

複数ユーザー・マシン別設定

複数ホストを管理する場合、ユーザーごとの共通設定とマシン固有設定を分離する。

# hosts/mbp2023/default.nix
{ config, lib, ... }:

{
  imports = [
    ../../users/alice
    ../../users/shared/macos-defaults
  ];

  home-manager.users.alice = {
    home.packages = with pkgs; [
      raycast
      orbstack
    ];
    
    # マシン固有の環境変数
    home.sessionVariables = {
      MACHINE_NAME = "mbp2023";
    };
  };
}

主要オプションの挙動

オプション 効果 推奨設定
useGlobalPkgs システムと同一のnixpkgsインスタンスを使用 true(重複評估回避)
useUserPackages パッケージを/etc/profiles/per-user/配下に配置 true(PATH競合防止)
backupFileExtension 衝突時の既存ファイルバックアップ拡張子 "backup"等を指定

セッション変数の取り扱い

Home Manager管理外のシェル(macOS標準の.zshrc等を手動編集している場合)で環境変数を有効化するには、以下のいずれかを.zshrcに追加する。

# useUserPackages = true の場合
source /etc/profiles/per-user/$USER/etc/profile.d/hm-session-vars.sh

# useUserPackages = false(デフォルト)の場合
source $HOME/.nix-profile/etc/profile.d/hm-session-vars.sh

osConfigによるシステム連携

Home Managerモジュール内でosConfigパラメータを受け取ることで、nix-darwin側の設定値を参照できる。

{ config, lib, pkgs, osConfig, ... }:

let
  # システムレベルのホスト名を利用
  hostname = osConfig.networking.hostName;
in
{
  programs.zsh.initExtra = ''
    # プロンプトにホスト名を反映
    PROMPT="%m ${hostname} %~ %# "
  '';
  
  # システムパッケージの有無で条件分岐
  home.packages = lib.optional osConfig.programs.fish.enable pkgs.fishPlugins.done;
}

トラブルシューティング

パーミッションエラー

useUserPackages = true時に/nix/store関連の書き込みエラーが発生する場合、nix-darwinのビルドユーザ設定を確認する。

nix.settings.build-users-group = "nixbld";

アプリケーションバンドルの検出

GUIアプリケーションがLaunchpadに表示されない場合、home.packagesではなくhomebrew.casksとの併用を検討するか、以下のようにhome.activationでリンクを作成する。

home.activation.linkApplications = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
  if [ -d ~/Applications/Home\ Manager\ Apps ]; then
    ln -sf ~/Applications/Home\ Manager\ Apps/*.app ~/Applications/ 2>/dev/null || true
  fi
'';

設定検証ワークフロー

変更を適用する前に必ずビルドテストを実行する。

# ビルドのみ実行(適用しない)
darwin-rebuild build --flake .#workstation

# 即時適用
darwin-rebuild switch --flake .#workstation

# 特定ユーザーのHome Managerのみ再構築
home-manager switch --flake .#alice

なお、home-managerコマンドを単独で使用する場合はhome-manager.useUserPackagesとパッージパスが一致するよう注意が必要である。

タグ: nix-darwin Home Manager Nix Flakes darwinSystem hm-session-vars

10月14日 14:33 投稿