macOSでNix Package Managerを導入して利用してみる
概要
Nixは純粋関数型パッケージマネージャーとして技術記事等で取り上げられることが増えてきたツールである。日本語の記事が増えてきて興味が湧いてきたので、実際に導入したり動かしたりしながらNixを利用してみる。
知識のインプット
とりあえずNixとその周辺知識・ツールについて把握できるように日本語の記事を探して読んでみる。若干すでに古くなってそうな情報もありそうだが、実際にNixを触ってみたりするときにはなるべく公式に近い情報を参照しながら進めるつもり。
Nixの概念的な知識を把握できそうな記事
特に後者のZenn本はNixのビルドやストアなどの特徴がわかりやすくまとめられていて良かった。
Home Managerに関する記事
nix-darwinに関する記事
方針
ユーザー環境を管理できるHome ManagerとmacOSのシステム設定等を管理できるnix-darwinが便利そうなので、これらを利用する手順のメモをこのスクラップの方針とする。
自分のdotfilesのリポジトリはあるのだが、Neovimの設定が一度壊れてしまってからdotfiles全体を放置してしまっておりメンテが滞っているのが現状。これをNixで管理できるようにするところまで進めたい。
Nixのインストール
まずはNix Package Managerをインストールする。
公式のインストーラーを試してみたがなかなか成功せず、読んだ記事のいくつかで紹介されていたnix-installerを使ってみるとインストールできた。
公式インストーラーを実行したときのゴミデータが残っていたせいかこちらも何度か失敗したが、nix-installerの失敗時のRevert処理がゴミデータを綺麗にしてくれたのか2回目の実行で無事インストールできた。
nix-darwinの導入
いくつかコマンドをnix runで試してみたあと、さっそくnix-darwinを導入してみる。Home Managerを先にやろうかと思ったが、Home Managerのインストール手順にnix-darwinを使った選択肢があったので先にnix-darwinを入れてみることにした(必要性は薄そうだがなんとなく)。
GitHubリポジトリのREADMEのflakesによるインストール手順に沿って実行していく。
詰まったところ
- git管理下にないflake.nix
- nix-installerで配置された /etc/nix/nix.conf との競合
git管理下にないflake.nix
flakesによるインストール手順のStep 1にて、flake.nixを作成してそれを適当なgit管理下のディレクトリ配下に置いた。Step 2で darwin-rebuild
コマンドを実行しようとするも No such file or directory
というエラーが出た。
どうやらflakes自体がgitとの併用がベースとなっているらしく、gitの追跡対象のファイルからflake.nixなどを探索するらしい。
git add
などで適用にgitの追跡対象に加えたら実行できた。
nix-installerで配置された /etc/nix/nix.conf との競合
Step 2の darwin-rebuild
コマンドを実行した際、 /etc/nix/nix.conf
がすでに存在するために途中で実行が止まってしまった。nix-installerで当該箇所にnixの設定ファイルが置かれていたのだが、nix-darwinもその場所にnixの設定ファイルを作成しようとするために競合してしまったみたい。
親切なことに古い /etc/nix/nix.conf
をrenameして待避させてから再実行してくださいと darwin-rebuild
コマンドが教えてくれてたので、その通りに再実行したら darwin-rebuild switch
が成功した。
defaultのnix-darwinの設定が反映されていたり、dockの設定を弄ってdarwin-rebuild switchを実行するとちゃんと設定が変わったので、ちゃんと動いてそう
nix-darwinのGitHub Wikiを眺めていたら以下のページを見つけた
(sudo) nix-collect-garbage -d
でnix storeのガベージコレクションを実行できるみたい。
nix-darwinというよりnix本体の機能だが、手持ちのM1 Macbook Airのストレージが心許ないので覚えておきたいコマンド。
Home Managerの導入
nix-darwinが動作するようになったので、nix-darwin経由でHome Managerを導入する。
Flakesベース+nix-darwin moduleでインストールする手順は以下の通り。
試しに下記のようにcurlを有効化した上でdarwin-rebuild switch
コマンドでHome Managerが有効化された。
home.packages = with pkgs; [
curl
];
$ type -a curl
curl is /usr/bin/curl
curl is /etc/profiles/per-user/thinceller/bin/curl # ← Home Managerでインストールされたcurl
Home Managerによる各ツールのインストールと設定
programs.<foo>
でインストールできるツールとhome.packages
でインストールするツールがあり、前者の場合はなるべく宣言的に設定を書いてみた。
宣言的に管理することが難しい設定ファイル等はlib.file.mkOutOfStoreSymlink
を使ってファイルをsymlinkで配置する方式をとった。