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