Eyes, JAPAN
純粋関数型パッケージマネージャ: 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.4
と Ruby 2.3
に依存するパッケージをなんの問題もなく共存させることが可能です。もちろん rbenv
の助けを借りずにです。
興味を持った方、Nixの世界でお待ちしております。