Try nix

Photo by Aditya Vyas on Unsplash

Nix に入門してみました.
homebrew 代替となる home-manager や nix-darwin などがありますが,今回は開発環境整備で利用してみることにします.
devcontainer 的な感じですね.

インストール

公式のインストーラーではなく,Determinate Systems の nix-installer を利用します.
公式よりも Determinate Systems の方が Flakes がデフォルト有効化されているなどのメリットがあるようです.

curl -fsSL https://install.determinate.systems/nix | sh -s -- install

nix develop

このコマンドを使うと,プロジェクトに定義された依存関係(コンパイラ、ライブラリ、ツールなど)を含む開発用のシェル環境が起動します.
具体的には flake.nix ファイルの devShell に定義された環境が起動する,というこのようです.
flake.nix は公式 Org に templates がまとまっているので,ここから始めるのがよさそう.

GitHub - NixOS/templates: Flake templates

Flake templates. Contribute to NixOS/templates development by creating an account on GitHub.

github.com favicon image github.com
$ nix develop
bash-5.2$ which python
/nix/store/xzjghvsg4fhr2vv6h4scihsdrgk4i76w-python3-3.12.9/bin/python

nix-direnv

nix develop では shell が bash で起動します.
普段は fish shell を利用しているので,fish で起動して欲しいところです.
nix-direnv を利用すると direnv が環境変数を自動でロードするように,devShell がロードされるようになります.
もちろん shell も普段利用しているものが利用できます.

GitHub - nix-community/nix-direnv: A fast, persistent use_nix/use_flake implementation for direnv [maintainer=@Mic92 / @bbenne10]

A fast, persistent use_nix/use_flake implementation for direnv [maintainer=@Mic92 / @bbenne10] - …

github.com favicon image github.com

home-manager は利用していないため,以下のコマンドでインストールしました.

nix profile install nixpkgs#nix-direnv

また, $HOME/.config/direnv/direnvrc に以下を記載します.

source $HOME/.nix-profile/share/nix-direnv/direnvrc

あとは use flake でそのディレクトリにある flake.nix がロードされるようになります.

echo "use flake" >> .envrc && direnv allow

他のディレクトリのものを参照することもできます.

use flake ~/flake-templates/python

まとめ

nix develop で nix に入門してみました.
メリットは以下かなと思います.

  • オーバーヘッドがない
    • devcontainer と異なり,shell が起動するだけのためオーバーヘッドがない
    • 特に Apple silicon を利用していると,x86 なコンテナはオーバーヘッドがデカい
  • 既存のツールが利用できる
    • devcontainer の場合コンテナに入っていないと利用できない (あたりまえ体操)
      • fish, eza, bat, ripgrep などなど…
  • ロックファイル
    • flake.lock で環境をロックできる
      • 開発環境の再現性が高い
    • といってもチームで nix を利用するのはハードルが高そうだが……