はじめに
最近、周囲でNixが脚光を浴び始めているように感じます。そこでWebエンジニアの一人として、導入する最中で感じたNixの魅力を紹介します。
想定読者
- macOSユーザー
- Nixを試したいけど何から始めるか迷っている方
- dotfiles盆栽につい手が伸びてしまう方
また、この記事ではNixの仕組みや構文の詳細は解説しません。
Nixとは
Nix is a tool that takes a unique approach to package management and system configuration. Learn how to make reproducible, declarative and reliable systems.
https://nixos.org/
日本語訳
Nixは、パッケージ管理とシステム設定に対して独自のアプローチをとるツールです。再現性が高く、宣言的で信頼できるシステムを構築する方法を学びましょう。
このようにNixは再現性の高さによって環境依存の問題(いわゆる「おま環」)を低減できます。私はM1 MacBook時代から長らく環境差異に苦しんできた経緯もあり、低減できる点を魅力的に感じました。
以下の動画がNixを始める動機となってくれました。Nixの利点がわかりやすく解説されています。
最初の一歩
以下のZennの本を読みながら進めることをおすすめします。
この本はタイトル通り「ちいさく」Nixを始めることができ、挫折しづらい構成になっています。
この本を読みながら、Nixのインストールから好みの設定までカスタマイズしていきました。生成AIの活用も良いですが、細かいところで引っかかることもあるので、しっかり基本を理解してから活用することを推奨します。
Nixを使ってみた感想
ポータビリティの高さ
別マシンに移っても、同じ設定ファイルから同じ環境が立ち上がります。チーム共有よりも、まずは自分の複数マシン間で恩恵を感じやすいでしょう。
私の場合は、プライベートで使用するPCと会社で使用するPCでmacOSの設定を共有しています。設定アプリを毎回手作業で操作することなく、宣言的になるため、管理しやすくなりました。
macOSの設定はnix-darwinを使うことで管理できます。sudoの認証をTouch IDに変更する設定も宣言的に管理できます。
{
self,
...
}:
{
nixpkgs.hostPlatform = "aarch64-darwin";
system.stateVersion = 6;
nix.enable = false;
# sudoの認証をTouch IDに変更する
security.pam.services.sudo_local.touchIdAuth = true;
}
細かい点は省きますが、前述の設定を記載した後、以下のコマンドを実行することで適用できます。
sudo darwin-rebuild switch --flake .
macOSの設定は変更頻度が低く、コマンドそのものを忘れやすいです。そのため、Makefileなどのタスクランナーで定義しておくと良いです。
先ほどのコマンドを会社で使用するPCで実行するだけで適用できました。dotfilesの変更後に適用する際にも大変便利です。
また、dotfilesの管理にはhome-managerも併用しています。home-managerはシェル設定やCLIツール、dotfilesなどのユーザー環境を宣言的に管理できます。これまでshell scriptとMakefileで管理していたシンボリックリンクも、home-managerでまとめて宣言的に扱えるようになりました。chezmoiなど別のツールもありますが、Nixでオールインワンに管理できる点は非常に好ましいです。
意外と読みやすい
これまでに複数のプログラミング言語を経験してきた私としては、読みやすい部類だと感じました。確かに一般に言われるとおり、Nix特有の構文もありますが、読む分には問題ない範疇です。
例えば、先ほど触れたhome-managerには以下のような記述があります。
# 外から username を受け取る関数
{ username, ... }:
# この設定が返す属性セット
{
# home-manager の設定
home-manager = {
# システム側の pkgs を共有する
useGlobalPkgs = true;
# ユーザー単位でパッケージを有効化する
useUserPackages = true;
# 子モジュールに username をそのまま渡す
extraSpecialArgs = { inherit username; };
# users.<ユーザー名> に別ファイルの設定を読み込ませる
users.${username} = import ../home/home.nix;
};
}
構文の詳細は省いていますが、噂で聞くより読みやすいと感じませんか?
ここまでNixに触れて感じた良さをまとめてきました。一方で、すべてをNixに寄せる必要はなく、向き不向きもあります。次に運用時の注意点を整理します。
注意点
miseなど他ツールと併用しても良い
当然ながら、Nixも銀の弾丸ではありません。Homebrewやmiseと併用する方が楽なケースは当然存在します。また、miseなどのツールまで完全移行するとなると、かなりの時間がかかります。
そのため、devshellは一旦見送ってもよいと思います。Devcontainerに慣れている方には合いそうですが、これまで使い続けてきたasdfやXxxenv(nodenvなど)を継続的に使うことも視野に入れると良いです。
Homebrewは完全に撲滅できる?
結論から言うと、完全な撲滅は難しいです。HomebrewでのみインストールできるパッケージのほとんどはNixに移行できます。しかし、caskはGUIアプリが多く、無理に置き換えると運用が煩雑になります。1つ前の章でも記載しましたが、共存することは悪ではありません。
また、nix-homebrewでNix内からHomebrewを管理することもでき、Nix的な管理にするか従来のHomebrew式の管理にするか選択できます。Homebrewを完全にアンインストールするよりもなるべくHomebrewへの依存を減らす方向で考えてみてください。
まとめ
Nixは、再現性と宣言的な記述によって環境差異の悩みを着実に減らしてくれるツールです。macOSの設定からdotfilesまで、一つの記述で複数マシンに同じ環境を再現できます。
おすすめしたいのは次のような方です。
- 個人用と会社用のMacでOSレベルの設定を揃えたい方
- Macを定期的に初期化したり買い替えたりする方
- macOSの設定を宣言的に管理したい方
- Homebrewの依存管理に疲れた方
最初から全てをNixに寄せる必要はありません。まずはnix-darwinでmacOSの設定を一つ書いてみる、くらいの粒度から始めて、合うところから広げていくアプローチをおすすめします。