Open9

macOSでNix Package Managerを導入して利用してみる

thincellerthinceller

概要

Nixは純粋関数型パッケージマネージャーとして技術記事等で取り上げられることが増えてきたツールである。日本語の記事が増えてきて興味が湧いてきたので、実際に導入したり動かしたりしながらNixを利用してみる。

thincellerthinceller

知識のインプット

とりあえずNixとその周辺知識・ツールについて把握できるように日本語の記事を探して読んでみる。若干すでに古くなってそうな情報もありそうだが、実際にNixを触ってみたりするときにはなるべく公式に近い情報を参照しながら進めるつもり。

Nixの概念的な知識を把握できそうな記事

特に後者のZenn本はNixのビルドやストアなどの特徴がわかりやすくまとめられていて良かった。

https://zenn.dev/natsukium/scraps/d260e091cb8fdc
https://zenn.dev/asa1984/books/nix-introduction

Home Managerに関する記事

https://blog.tomoyukim.net/entry/nix-home-manager/
https://blog.ryota-ka.me/posts/2021/12/31/home-manager

nix-darwinに関する記事

https://scrapbox.io/mrsekut-p/nix-darwin
https://qiita.com/suin/items/809236c1a6235ca012d7

thincellerthinceller

方針

ユーザー環境を管理できるHome ManagerとmacOSのシステム設定等を管理できるnix-darwinが便利そうなので、これらを利用する手順のメモをこのスクラップの方針とする。

自分のdotfilesのリポジトリはあるのだが、Neovimの設定が一度壊れてしまってからdotfiles全体を放置してしまっておりメンテが滞っているのが現状。これをNixで管理できるようにするところまで進めたい。

thincellerthinceller

Nixのインストール

まずはNix Package Managerをインストールする。

公式のインストーラーを試してみたがなかなか成功せず、読んだ記事のいくつかで紹介されていたnix-installerを使ってみるとインストールできた。

https://github.com/DeterminateSystems/nix-installer

公式インストーラーを実行したときのゴミデータが残っていたせいかこちらも何度か失敗したが、nix-installerの失敗時のRevert処理がゴミデータを綺麗にしてくれたのか2回目の実行で無事インストールできた。

thincellerthinceller

nix-darwinの導入

いくつかコマンドをnix runで試してみたあと、さっそくnix-darwinを導入してみる。Home Managerを先にやろうかと思ったが、Home Managerのインストール手順にnix-darwinを使った選択肢があったので先にnix-darwinを入れてみることにした(必要性は薄そうだがなんとなく)。

GitHubリポジトリのREADMEのflakesによるインストール手順に沿って実行していく。

https://github.com/LnL7/nix-darwin#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 が成功した。

thincellerthinceller

defaultのnix-darwinの設定が反映されていたり、dockの設定を弄ってdarwin-rebuild switchを実行するとちゃんと設定が変わったので、ちゃんと動いてそう

thincellerthinceller

nix-darwinのGitHub Wikiを眺めていたら以下のページを見つけた
https://github.com/LnL7/nix-darwin/wiki/Deleting-old-generations

(sudo) nix-collect-garbage -d でnix storeのガベージコレクションを実行できるみたい。

nix-darwinというよりnix本体の機能だが、手持ちのM1 Macbook Airのストレージが心許ないので覚えておきたいコマンド。

thincellerthinceller

Home Managerの導入

nix-darwinが動作するようになったので、nix-darwin経由でHome Managerを導入する。

Flakesベース+nix-darwin moduleでインストールする手順は以下の通り。
https://nix-community.github.io/home-manager/index.xhtml#sec-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
thincellerthinceller

Home Managerによる各ツールのインストールと設定

programs.<foo>でインストールできるツールとhome.packagesでインストールするツールがあり、前者の場合はなるべく宣言的に設定を書いてみた。

宣言的に管理することが難しい設定ファイル等はlib.file.mkOutOfStoreSymlinkを使ってファイルをsymlinkで配置する方式をとった。