🐕

Nix を試してみる part1

2023/12/17に公開

毎週、Infra Weekly を見ているのですが、最近 Nix の記事が多かったり、去年辺りから NixCon というものが開催されてたりで面白そうだったので Zero to Nix を試してみます。
良さそうでされば、brew や aqua からの移行も考えています。

ちょうど最近、George Hotz も Youtube で Zero to Nix をやってたので、動画で見られたい方は参考になると思います。

8ステップありますが、初見かつボリュームが多そうなので2つの記事に分けて書きたいと思います。

試してみる

1. Get Nix running on your system

まずは、Nix をインストールします。
大体のプラットフォームに対応してそうです。

$ curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
...
Nix was installed successfully!

$ nix --version
nix (Nix) 2.18.1

2. Run a program with Nix

Nix を使ってプログラムを実行します。

$ echo "Hello Nix" | nix run "nixpkgs#ponysay"
error: cannot open SQLite database '/Users/eigo.oda/.cache/nix/fetcher-cache-v1.sqlite': unable to open database file

エラーになりました...
https://discourse.nixos.org/t/nix-flake-and-fetcher-cache-v1-sqlite/8958 を見ると ~/.cache/nix の所有者を変更するとあるので、現在の所有者を見てみます。

$ ls -la ~/.cache/
...
drwxr-xr-x@    - root     16 Dec 15:40 nix

root になっていたので、chown で今ログインしているユーザに変更し、nix runコマンドでponysayを実行します。
初回の場合、ビルドしたりダウンロードしたりストアに格納したりで実行が遅くなりますが、気長に待ちましょう。

$ chown eigo.oda ~/.cache/nix

$ ls -la ~/.cache
...
drwxr-xr-x@    - eigo.oda 16 Dec 16:14 nix

$ echo "Hello Nix" | nix run "nixpkgs#ponysay

 ___________
< Hello Nix >
 -----------
       \
        \
         \
         ▄▄▄▄ ▄▄▄▄
   ▄▄▄▄▄████▄▄████▄▄▄
   ██████▄▄▄▄███▄█████
    ▀▄██▄▄█▄▄██▄▄▄██▄██
     ▀▄█▄███▄▄▄█████▄██
     ▀▀▀ ▀▄█▄▄▄▄▄▄███▄▄▄
        ▄▄▄███▄▄▄█▄███▄██
       ▄▄▄▄█▄▄█▄▄▄██▄▄██      ▄▄▄▄▄
       ▀▄▄▄██▄▄██████▄▀     ▄▄███▄▄▄
         ▀▄▄▄▄▄▄▄███▄        ▀▄▄▄▄▄▀
              ██▄▄▄██▄▄▄▄▄█▄▄▄▄▄▀
              █▄█▄▄▄▄▄█████████▄▄
              █▄▄███▄▄██▄████████
             ▄▄█▀▄▄▄█████▄▄████▄▀
             ███ ███████▄█▄▄████▄
             ▀▀▀ ██████▀ ▀▄████▄██
                ▄▄█▄▄▄█   ████▄▄▄▄▄
                ███████   ▄▄▄█▄▄▄▄█
              ▄█▄▄▄▄▄▄▄  ▄▄█████████
              █▄███████  █▄▄▄▄██████
               █▄▄▄▄▄█      █▄▄▄▄▄▄▀

無事、ponysayを実行することができました。
nix runの詳細はこちらをご確認ください。

3. Explore Nix development environments

Nix の development environments という機能を使います。
shell システムを構築するもののようで、ホストから分離されているため他の環境やツールから変更を加えることができない環境です。

$ nix develop "github:DeterminateSystems/zero-to-nix#example"

(nix:zero-to-nix-env) xxxx:nix eigo.oda$

nix developを実行すると新しい shell のプロンプトが現れました。
この shell には、curl と git が含まれているので、確認してみます。

(nix:zero-to-nix-env) xxxx:nix eigo.oda$ type git
git is /nix/store/mgp3sykmxzaf8r42fwc51239qh4j27cy-git-2.40.1/bin/git

(nix:zero-to-nix-env) xxxx:nix eigo.oda$ type curl
curl is /nix/store/80cz8a3bvkps2ynphvhimbvdygdk0hyw-curl-8.1.1-bin/bin/curl

(nix:zero-to-nix-env) xxxx:nix eigo.oda$ type kubectl
kubectl is /Users/eigo.oda/.local/share/aquaproj-aqua/bin/kubectl

ローカルホストには、curl と git をインストールしていますが、Nix で用意されたものが表示されました。
kubectl はローカルホストにはインストールされているのですが、nix developで用意した shell にはインストールされていないので、ローカルホストのパスが表示されました。

development environments で用意された shell のコマンドパスが奇妙に見えますが、以下のような命名規則となっています。

また、shell にログインせず development environments にコマンドを実行することもできます。

$ nix develop "github:DeterminateSystems/zero-to-nix#example" --command git help

$ nix develop "github:DeterminateSystems/zero-to-nix#example" --command curl https://example.com

以下コマンドで Go の development environments を構築できます。

$ nix develop "github:DeterminateSystems/zero-to-nix#go"
Welcome to a Nix development environment for Go!

(nix:nix-shell-env) xxxx:nix eigo.oda$ type go
go is /nix/store/sf7mynigbcqs2j18j4cpqnfrzg2rf5am-go-1.19.12/bin/go

(nix:nix-shell-env) xxxx:nix eigo.oda$ go version
go version go1.19.12 darwin/arm64

特定のパッケージを組み合わせた環境も構築できます。
以下の環境は、Pyton、kubectl、Terraform、OpenSSL が入った環境です。

$ nix develop "github:DeterminateSystems/zero-to-nix#multi"

自分が利用するパッケージのみがインストールされた環境の構築方法が気になりました。

4. Build a package using Nix

ついにパッケージ管理まで来ました。パッケージ(bat)をビルドします。

mkdir build-nix-package && cd build-nix-package
nix build "nixpkgs#bat"

ディレクトリに result という名前のシンボリックリンクが作成され、Nix store のパッケージと紐づいています。

$ ls -la
lrwxr-xr-x@ 54 eigo.oda 17 Dec 04:12 result -> /nix/store/jvzjjz8nrgqayqhmfha26a77s2kha82j-bat-0.24.0

$ ./result/bin/bat --help
A cat(1) clone with syntax highlighting and Git integration.

Usage: bat [OPTIONS] [FILE]...
       bat <COMMAND>

bat コマンドが叩けることを確認できました。
development environments 同様、こちらも命名規則があります。

終わりに

Zero to Nix の前半4ステップを試してみました。
nix run に関しては docker などのコンテナプラットフォームと似たようなものを感じましたが、コンテナと比べてホストのコマンドも実行できるのが嬉しいですね。
次回は、後半の4ステップを実行しようと思います。

GitHubで編集を提案

Discussion