Nix学習備忘録Part 2: Home Managerを導入する

2022-01-29T15:09:32Z

1 はじめに

Home Managerについては、既に日本語の記事がいくつか書かれているため、 ところどころ説明は省略します。

参考にした記事:

本記事は既にNixのインストールを完了していることを前提としています。 Nixをインストールしていない方は、 Nix学習備忘録Part 1: Nixに入門するを参考にして、 Nixのインストールを完了してください。

また、インストールする各種ソフトウェアの詳細な設定については、別途記事を設けることにします。 本記事では、取り敢えずHome Managerの概要と導入方法について簡単にまとめます。

2 Home Managerとは

Home Mangerは、 Nixパッケージマネージャを用いて、ユーザー環境を管理するためのシステムです。 これにより、

  • ユーザープロファイルでソフトウェアを宣言的にインストールする
  • ユーザーのホームディレクトリ内のドットファイルを管理する

ことが可能になります。

apt-get installや、Homebrewを用いたbrew installなどで順次ソフトウェアをインストールした場合の、 他のマシンで同様のユーザー環境を設定することが難しいという問題を解決してくれます。

3 Home Mangerのインストール方法

NixOSや、Nix-Darwinを利用している方は、こちらでは動作確認ができないため、 Home ManagerのGitHubを参考にして、 インストールしてください。

以下を実行します(2つ目のnix-channel --updateは数分掛かるかもしれません):

$ nix-channel --add https://github.com/nix-community/home-manager/archive/release-21.11.tar.gz home-manager
$ nix-channel --update
this derivation will be built:
  /nix/store/rzr2p7ggvnij2j3j218mwx83c3f371xl-home-manager-21.11.drv
building '/nix/store/rzr2p7ggvnij2j3j218mwx83c3f371xl-home-manager-21.11.drv'...
# (数分後)
unpacking channels...
$

cat $SHELLで、使用しているシェルを確認します。 私は(現時点では)bashを使っている1ので、.bashrcに以下を追記します:

export NIX_PATH=$HOME/.nix-defexpr/channels:/nix/var/nix/profiles/per-user/root/channels${NIX_PATH:+:$NIX_PATH}

.bashrcを再読み込みすることをお忘れなく。

$ source ~/.bashrc

次に、nix-shell '<home-manager>' -A installでHome Managerをインストールします:

$ nix-shell '<home-manager>' -A install
warning: warning: Nix search path entry '/nix/var/nix/profiles/per-user/root/channels' does not exist, ignoring
this derivation will be built:
  /nix/store/32w0dk3fflv3hrpgsrx2923km7vf8gxl-home-manager.drv
these 65 paths will be fetched (22.26 MiB download, 99.42 MiB unpacked):
  /nix/store/1kfaw03fx9js1k71a2ch5rhvpa66hr51-boehm-gc-8.0.6
  /nix/store/1x52sc2zzbsymi3ydk7a7i2c2qg8q6j1-aws-c-http-0.6.10
# (中略)
There are 175 unread and relevant news items.
Read them by running the command 'home-manager news'.


All done! The home-manager tool should now be installed and you
can edit

    /home/username/.config/nixpkgs/home.nix

to configure Home Manager. Run 'man home-configuration.nix' to
see all available options.

インストールが完了し、Home Managerの設定が、 /home/username/.config/nixpkgs/home.nixに記述できると教えてくれています。 説明の通り、home.nixに各種設定を記述していきます。

4 home.nixを更新する

Home Managerのインストールに成功すると、home.nixというファイルが~/.config/nixpkgs内に作成されます。

初期状態のhome.nix
{ config, pkgs, ... }:

{
  # Home Manager needs a bit of information about you and the
  # paths it should manage.
  home.username = "username";
  home.homeDirectory = "/home/username";

  # This value determines the Home Manager release that your
  # configuration is compatible with. This helps avoid breakage
  # when a new Home Manager release introduces backwards
  # incompatible changes.
  #
  # You can update Home Manager without changing this value. See
  # the Home Manager release notes for a list of state version
  # changes in each release.
  home.stateVersion = "21.11";

  # Let Home Manager install and manage itself.
  programs.home-manager.enable = true;
}

4.1 プログラムの追加

グローバル環境で設定ファイル等を管理するようなプログラムがprogramsに用意されています。 利用可能なプログラムは、 Home ManagerのGitHub内のprograms から確認できます。

まず、試しに適当にNeoVimをインストールしてみましょう。 現段階では私の環境には入っていません:

$ which nvim
$

home.nixprograms.home-manager.enable=true;の下にprograms.neovim.enable=true;と記述を追加してみます。

NeoVimを有効にしたhome.nix
{ config, pkgs, ... }:

{
  # Home Manager needs a bit of information about you and the
  # paths it should manage.
  home.username = "username";
  home.homeDirectory = "/home/username";

  # This value determines the Home Manager release that your
  # configuration is compatible with. This helps avoid breakage
  # when a new Home Manager release introduces backwards
  # incompatible changes.
  #
  # You can update Home Manager without changing this value. See
  # the Home Manager release notes for a list of state version
  # changes in each release.
  home.stateVersion = "21.11";

  # Let Home Manager install and manage itself.
  programs.home-manager.enable = true;
  programs.neovim.enable = true; # <- この行を追加
}

設定を反映させるためには、home.nixを保存し、ターミナルでhome-manager switchを実行します。

$ home-manager switch
these 12 derivations will be built:
  /nix/store/3qqx1h8wdgzvxsa40m509r98mgz24rc8-neovim-ruby-env.drv
  /nix/store/5gbdkj17wcb0bkd9dmix6dhhyap46362-python3-3.9.9-env.drv
(中略)
There are 175 unread and relevant news items.
Read them by running the command 'home-manager news'.
$ which nvim
/home/username/.nix-profile/bin/nvim

これでNeoVimが使えるようになりました!プラグイン等を設定することもできるのですが、 Home Managerというより、NeoVimの説明になるため、別の記事として書くことにします。

4.2 パッケージの追加

グローバル環境に入れておきたいnix-env等のコマンドでインストールするようなパッケージは、 home.packagesに記述します。複数形であることからも推測できる通り、リストの形式で記述します。

例として、yarnを追加してみましょう。例のごとく、私の環境にはまだインストールされていません。

$ which yarn
$

home.stateVersion = "21.11";の下に、 home.packages = [ pkgs.yarn ];という記述を追加します。

yarnのインストールを追記したhome.nix
{ config, pkgs, ... }:

{
  # Home Manager needs a bit of information about you and the
  # paths it should manage.
  home.username = "username";
  home.homeDirectory = "/home/username";

  # This value determines the Home Manager release that your
  # configuration is compatible with. This helps avoid breakage
  # when a new Home Manager release introduces backwards
  # incompatible changes.
  #
  # You can update Home Manager without changing this value. See
  # the Home Manager release notes for a list of state version
  # changes in each release.
  home.stateVersion = "21.11";
  home.packages = [ pkgs.yarn ]; # <- この行を追加

  # Let Home Manager install and manage itself.
  programs.home-manager.enable = true;
}

設定を反映させるために、home.nixを保存し、home-manager switchを実行します。

$ home-manager switch
(略)
$ which yarn
/home/username/.nix-profile/bin/yarn

グローバル環境には必要ないなと思ったプログラムやパッケージは、 このhome.nixから記述を消して再度home-manager switchを実行すれば消すことができます。

4.3 ひな形

Home Managerをこの記事で入門する人のために、ひな形を置いておきます。 記述としては、大きくhomeprogramsの2つに分かれ、毎回home.programs.と書くのが面倒なので、 私はまとめて書いています。

{ config, pkgs, ... }:

{
  home = {
    homeDirectory = builtins.getEnv "HOME";
    packages = with pkgs; [
      cachix
      niv
    ];
    stateVersion = "21.11";
    username = builtins.getEnv "USER";
  };

  programs = {
    direnv = {
      enable = true;
      nix-direnv.enable = true;
    };
    git = {
      enable = true;
      userEmail = "your.github.account@gmail.com";
      userName = "yourGitHubUserName";
    };
    home-manager = {
      enable = true;
    };
  };
}

home.usernamehome.homeDirectoryは、関数を使って環境変数から読み取るように設定しています。

packagesには、後で自分で記述する際に書きやすいよう、あっても邪魔にならないであろう、 Cashixと、niv を適当に置いています。邪魔なら行を削除し、適当なパッケージを追加してください。

programsにも、前回の記事で紹介したdirenvのインストールと、 gitの設定について記述しています。gitについては、もっと細かく設定することもできるため、 詳細についてはGitHubのprograms/git.nixを参照してください。

5 まとめ

Home Managerを使うことで、ユーザー環境を宣言的に管理することができるようになりました。 例えばhome.nixをGitHub等で管理しておけば、新しいPCへの移行はNixとHome Managerをインストールした上で、 home.nixの内容を移してhome-manager switchすれば完了します。凄いですね。

次回以降は、しばらくHome Managerをいじる話をする予定です。

最近、Zsh × NeoVim × Tmuxの開発環境に入門したため、

  • Home ManagerでZshのインストールし、入門する
  • Home ManagerでNeoVimをインストールし、入門する
  • Home ManagerでTmuxをインストールし、入門する

という記事を書いてみようかなと考えています。

5.1 余談(VSCodeについて)

MacやLinuxをお使いの方は、VSCodeのインストールのインストールから、 拡張機能等までHome Managerで管理することができます。

Windowsの場合、私はWSLでVSCodeを使っているのですが、このケースだと、 WindowsにダウンロードしたVSCodeを参照して使う形になります:

$ which code
/mnt/c/Users/WindowsUserName/AppData/Local/Programs/Microsoft VS Code/bin/code

このため、Home Managerに記述してWSLにインストールされるVSCodeとは別物になってしまって、 拡張機能が管理できない問題にぶち当たっています。 Nixの方のVSCodeを使おうとすると、WSL内のGUIを使うことになり、見た目が気持ち悪いVSCodeが起動することになります。 (個人的に調べた限りではWSLでUbuntuではなくNixOSを使っている場合の解決策はありました。) もしWSL × Home Manager × VSCodeをお使いの方で、 この問題の解決策をご存じの方がいらっしゃいましたら、ご連絡頂けると非常に嬉しいです。


  1. 後にHome Managerを使用してzshに移行します。↩︎