Nix学習備忘録Part 2: Home Managerを導入する
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.nix
のprograms.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をこの記事で入門する人のために、ひな形を置いておきます。 記述としては、大きくhome
とprograms
の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.username
とhome.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をお使いの方で、 この問題の解決策をご存じの方がいらっしゃいましたら、ご連絡頂けると非常に嬉しいです。
後にHome Managerを使用してzshに移行します。↩︎