NixパッケージマネージャーとmacOS

最近Nixというパッケージマネージャーを使っている。

今までmacOSのパッケージマネージャーとしてはHomebrewMacPortsを使っていたのだが、やや飽きてきた。macOS High SierraをMacBookに入れるときにパッケージマネージャーも何か新しいものを使ってみようと思っていたところ、Nixを見付けた。


NixはLinuxとmacOSに対応したパッケージマネージャーだ。Nixのウェブサイトには”The Purely Functional Package Manager”と書いてあるのだが、それがどういう意味なのかはあまり分からない。

NixはパッケージをNixストアと呼ばれる場所にインストールする。各パッケージがインストールされるディレクトリーの名前には識別子が付いていて、同じパッケージでバージョンの異なるものなどがあっても、ちゃんと別々に分けて管理することができる。

Nixにはプロファイルという考え方があって、各プロファイルはそれぞれ異なるパッケージを持つことができる。パッケージ自体はNixストアにインストールされているので、プロファイルがパッケージを持つということは、プロファイルの中にパッケージの中のファイルのシンボリックリンクを張るということを意味する。ユーザーはプロファイルを切り替えることによって、インストールされているパッケージの異なる環境を使うことができるようになる。

Nixについて、詳しく知りたい人はマニュアルを参照してほしい。


ということで、NixでmacOSのパッケージ管理をすることにしたのだが、Nixには2つのモードがある。シングルユーザーモードとマルチユーザーモードだ。Nixのウェブサイトに書いてあるとおりにNixをmacOSにインストールすると、マルチユーザーモードでインストールされる。ところが、macOS上でNixをマルチユーザーモードで動かしていると、何となく動きが怪しいような気がした。本当は原因を調べるべきなのだろうが、macOSにNixをシングルユーザーモードでインストールする方法を書いた記事を見付けてしまったので、その記事に従ってシングルユーザーモードでインストールすることにした。

これで特に問題はなかったのだが、その記事に書いてある方法はNixをmacOSにマルチユーザーモードでインストールした後で、マルチユーザーモードの要素を取り除くという方法を取っていた。これが何となく気になっていて、最初からシングルユーザーモードでインストールすることはできないかと考えた。その結果を書く。


Nixのウェブサイトに従うと、Nixはinstallファイルを使ってインストールすることになる。installファイルを読むと、https://nixos.org/releases/nixにNixをインストールするために必要なファイルがあることが分かる。今回はnix-1.11.15-x86_64-darwin.tar.bz2ファイルをダウンロードした。

$ curl -O https://nixos.org/releases/nix/nix-1.11.15/nix-1.11.15-x86_64-darwin.tar.bz2

このファイルを展開すると、次のファイル及びディレクトリーができる。

  • .reginfoファイル
  • install-darwin-multi-userファイル
  • storeディレクトリー

.reginfoファイルはNixストアをシリアライズしたデータ、install-darwin-multi-userファイルはNixをmacOSにマルチユーザーモードでインストールするためのシェルスクリプト、storeディレクトリーはNixのインストールに必要なパッケージを含むディレクトリーだ。よって、install-darwin-multi-userファイルを見ながら、マルチユーザーモードとは関係なさそうな部分だけを使っていくことにする。

$ tar -xzf nix-1.11.15-x86_64-darwin.tar.bz2
$ cd nix-1.11.15-x86_64-darwin

storeディレクトリーは通常/nix/storeディレクトリーにあるので、そこにstoreディレクトリーを置く。

$ sudo mkdir /nix
$ sudo chown ykomatsu:staff /nix
$ mv store /nix

Nixのインストールに使うプログラムは/nix/store/dgwz3dxdzs2wwd7pg7cdhvl8rv0qpnbj-nix-1.11.15/binディレクトリーの中にあるので、パスを通す。

$ export PATH=”/nix/store/dgwz3dxdzs2wwd7pg7cdhvl8rv0qpnbj-nix-1.11.15/bin:${PATH}”

次にNixストアを初期化する。そして、Nixストアにデータをインポートする。

$ nix-store --init
$ cat .reginfo | nix-store --load-db

Nixのプロファイルを作る。

$ mkdir -p "/nix/var/nix/profiles/per-user/${USER}"
$ nix-env -S "/nix/var/nix/profiles/per-user/${USER}/profile"

続いてNixのインストールに必要なパッケージをインストールする。nixとnss-cacertの2つだ。

$ nix-env -i /nix/store/dgwz3dxdzs2wwd7pg7cdhvl8rv0qpnbj-nix-1.11.15
$ nix-env -i /nix/store/5kwzlhrdahr4zl1smfxna327yffhx161-nss-cacert-3.31

そしてNixに必要な環境変数などの設定をするためにnix.shファイルを読み込む。

$ . "${HOME}/.nix-profile/etc/profile.d/nix.sh"

Nixチャネルを設定する。NixチャネルとはNix式とマニフェストの集まりを指すものらしい。おそらくパッケージのリポジトリーのようなものだと思う。install-darwin-multi-userファイルではnixpkgs-unstableチャネルを設定していたのでそれに従う。

$ nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs
$ nix-channel --update

これでNixを使うことができるようになった。試しにパッケージを検索してみる。

$ nix-env -qa p7zip

後、nix.shファイルを読み込むように.profileファイルなどに次の文を追加する。

. "${HOME}/.nix-profile/etc/profile.d/nix.sh"

一応これでNixを使うことができるようになったが、macOSでNixをシングルユーザーモードで使うことがよいことなのかどうかは分からない。

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.