目次
Background
- dotfilesをnixに半分移行した
- 宣言的一発で環境再現ができるから
- ただし、GPU系の処理が厳しいので、NixOSは使わない
- 既存のUbuntu上でNixのHome Managerでdotfilesの管理をする構成
Nixとは
- Nixはパッケージマネージャーであり、同時にプログラミング言語
- 通常のパッケージマネージャー(apt、brewなど)との最大の違いは宣言的である点
- 「このパッケージをインストールしてほしい」と書いておけば、Nixがその状態を実現してくれる
- また、パッケージは
/nix/store/以下にハッシュ付きのパスで格納される -そのたため、バージョンが異なる同一パッケージを共存させられるし、環境が壊れても以前の状態にロールバックできる
| |
NixパッケージのソースはnixpkgsというGitHubリポジトリで管理されており、パッケージが揃っている。
Flakeとは
FlakeはNixのプロジェクト管理の仕組み。flake.nixというファイル1つでプロジェクトの依存関係と出力を定義する。
| |
inputsは依存するリポジトリやパッケージセットを宣言する。
outputsはそのflakeが外部に提供するもの(パッケージ、設定、開発環境など)を返す関数。
Flakeを使うとflake.lockが生成され、依存リポジトリの正確なコミットハッシュが記録される。
これによりどのマシンでも同一の環境を再現できる。
Flake登場以前は、nixpkgsのバージョンが実行環境によって変わってしまい、再現性に難があった。 現在はFlakeが事実上の標準となっている。
Home Managerとは
Home ManagerはNixをベースにしたユーザー環境管理ツール。
Nixは本来OSレベルのパッケージ管理が得意だが、Home Managerを使えばユーザーのホームディレクトリ以下の管理もNixで行える。具体的には:
~/.config/以下の設定ファイルの配置~/以下のdotfileの配置- ユーザー向けパッケージのインストール
NixOSはOS全体をNixで管理するディストリビューションだが、Home ManagerはUbuntuやmacOSなど既存のOSの上でそのまま使えるのが特徴。
flake.nix
| |
基本はnixpkgs-unstableを使うが、一部のパッケージ(tmux 3.4など)はstableから取る。
stableのパッケージセットはpkgs-stableという名前で_module.args経由でモジュールに渡している。
inputs.nixpkgs.follows = "nixpkgs"は、Home Managerがインターナルでもつnixpkgsをこちらのnixpkgsに統一する指定。これがないと2つの異なるnixpkgsが混在して余計なビルドが走ることがある。
.#myhomeの意味
home-manager switch --flake .#myhomeの.#myhomeはFlakeのアドレス記法。
| |
flake.nixのoutputsにはhomeConfigurations."myhome"というキーで設定を登録してある。
.#myhomeはそれを指定している。
複数ユーザーや複数マシンの設定を1つのflakeに共存させることも可能。
| |
設定ファイルの配置
Home Managerのhome.fileを使えば、設定ファイルをホームディレクトリ以下の任意のパスにシンボリックリンクとして配置可能。
| |
Neovimのinit.luaなど、プラグインマネージャーが実行時に書き換えるファイルはmkOutOfStoreSymlinkでNix storeを経由せず直接リンクを張る。Nix storeは読み取り専用なので、書き換えが発生するファイルは通常の.sourceでは壊れてしまう。
| |
direnv連携
shell.nixでdirenvとnix-direnvを有効にしている。
| |
direnvはディレクトリに入ったとき自動で環境変数を設定するツール。
nix-direnvはその拡張で、flake.nixを持つプロジェクトディレクトリにcdするだけで
そのプロジェクト専用のNix環境が自動で有効になる。
AIツール
ai.nixでは最近増えたAI CLIツールをまとめて管理している。
| |
claude-codeはunfreeパッケージなので、home.nixで許可リストに追加している。
| |
使い方
初回セットアップは以下のコマンド。
Home Manager自体がまだ入っていなくても、nix runでHome Managerを一時的に起動して適用できる。
| |
2回目以降は
| |
これだけでパッケージのインストールと設定ファイルの配置が完了する。
注意点
- nixはstoreですべてが管理されてしまうため、コンパイルやリンクで問題が起きがち
- 特に、nixのpythonやtoolを使うと発生する
- そのため、コンパイラーやリンカー、pythonなどはubuntuのものを使うようにしている
| |
まとめ
- Nixは宣言的・再現性のあるパッケージ管理を実現する
- FlakeはNixプロジェクトの依存関係を
flake.lockでピン留めし、再現性を保証する - Home ManagerはNixをユーザー環境の管理に応用したツールで、既存OSの上でも動く
- パッケージ管理と設定ファイル管理を一箇所で宣言的に扱えるため、ある程度は新しいマシンへの移行が容易
