Eyes, JAPAN Blog > 純粋関数型パッケージマネージャ: Nixを使ってみる

純粋関数型パッケージマネージャ: Nixを使ってみる

Yuki Ito

NixというUnix用のパッケージマネージャーがあります。Homebrewやaptのようなものですね。

と書くと普通のパッケージマネージャーのように思えますが、実はこのNixは他のものと比べてもかなり特徴的です。

今回はこのNixの特徴、「純粋関数型パッケージマネージャー」とは何か、Nixの使い方を紹介します。

とりあえずインストールしてみる

curl https://nixos.org/nix/install | sh

Nixとは?

Homebrewやaptのように、パッケージ名を入れるとそのパッケージをインストールしてくれるところまでは一緒です。

試しにパッケージをインストールしてみましょう。

nix-env --install hello

しかし、違うバージョンのパッケージを共存させることができるのはとができるのは目新しいのではないでしょうか。以下のような感じです。

nix-env --install firefox-34.0.5
nix-env --install firefox-33.0.2

このコマンドを実行しても、古いFireFoxが上書きされることはありません。

どうしてこのようなことができるのでしょうか? それには /nix/var/nix/profiles を覗いてみるとわかりやすいかも知れません。

yuki@yuki-ubuntu-1:~$ ls -l /nix/var/nix/profiles/
total 12
lrwxrwxrwx 1 yuki yuki   14 Oct 20 11:02 default -> default-2-link
lrwxrwxrwx 1 yuki yuki   60 Oct 20 10:54 default-1-link -> /nix/store/0scfamgyalc4kmg9943ra21a8xh3na5l-user-environment
lrwxrwxrwx 1 yuki yuki   60 Oct 20 11:02 default-2-link -> /nix/store/6gnxnybywaccvmz70wk94qw4r87j6hil-user-environment
drwxr-xr-x 3 yuki yuki 4096 Oct 20 10:54 per-user

これは先程のをインストールした状態です。 default/bin/ にはPATHが通っています。確かに、 default/bin の中身には hello の実行ファイルがあるのがわかります。

ここで、 nix-env --rollback というコマンドを使って hello がインストールされていない状態に戻してみます。

yuki@yuki-ubuntu-1:~$ nix-env --rollback
switching from generation 2 to 1
yuki@yuki-ubuntu-1:~$ ls -l /nix/var/nix/profiles/
total 12
lrwxrwxrwx 1 yuki yuki   14 Oct 20 11:35 default -> default-1-link
lrwxrwxrwx 1 yuki yuki   60 Oct 20 10:54 default-1-link -> /nix/store/0scfamgyalc4kmg9943ra21a8xh3na5l-user-environment
lrwxrwxrwx 1 yuki yuki   60 Oct 20 11:02 default-2-link -> /nix/store/6gnxnybywaccvmz70wk94qw4r87j6hil-user-environment
drwxr-xr-x 3 yuki yuki 4096 Oct 20 10:54 per-user

default のシンボリックリンクの向き先が変わったのが分かるでしょうか。これによって、 default/bin/hello もなくなりました。

つまり、Nixでは nix-env を使った操作をするごとにSnapShotを取っています。全てはシンボリックリンクなので無駄な容量を喰うことはなく、全ての状態/バージョンを管理することができています。

これを応用すると、例えば Ruby 2.4Ruby 2.3 に依存するパッケージをなんの問題もなく共存させることが可能です。もちろん rbenv の助けを借りずにです。

興味を持った方、Nixの世界でお待ちしております。

  • このエントリーをはてなブックマークに追加

コメントは受け付けていません。