Nix
https://gyazo.com/9b806f305b506804a42a7fa83befa935
The Purely Functional Package Manager
https://nixos.org/
一言で説明するのは難しいが,
優れた依存解決ツール
パッケージマネージャ
ビルドツール
といった側面を持つ.
Shopify でも Nix が活用されているらしく,中の人による入門記事がある.
https://shopify.engineering/what-is-nix
HERPでは,リポジトリごとに固有の開発に必要な依存の宣言や,成果物 (e.g. npm package, Docker image) のビルドなどに用いられている.
Linux と macOS がサポートされている.最近はWSL2もサポートし始めている
NixOS と区別すること.
嬉しさ
https://nixos.org/#examples にいろいろ動画があるので見るといいです.
「Homebrew などでインストールした hogehoge に依存する開発」という形態を取る以上,環境構築の煩わしさや,インストールされているソフトウェアのヴァージョンの不一致といった非生産的な問題から逃れることは難しい.
Nix を用いることでこのような問題が解決される.
インストール
https://nixos.org/download.html
基本的な使い方
開発環境の共有
各リポジトリに shell.nix というファイルを置いておくことで,そのリポジトリの開発に必要な依存を宣言できる.
.nix ファイルは Nix Language という言語で記述する.
また,$ nix-shell を実行すると,それらの依存がインストールされ $PATH が通った状態のシェルが立ち上がる.
direnv の use nix を用いると,nix-shell を立ち上げる必要さえなくなるため,そのような .envrc もリポジトリに合わせて用意されていることが多い.
nix-direnvを使うと上記で参照される shell の derivation がキャッシュされるようになる。
.direnv/ というディレクトリを作るため、 $XDG_HOME/git/ignore などに .direnv/ を追記するとよい。
成果物のビルド
Nix の優れた依存解決の仕組みを用いて,再現性の高いビルドを実現することができる.
#TODO もうちょっと詳しく書く
Stack Nix integraion
#TODO あとで書く
ちょっとオタク向けの使い方
Homebrew などの代替として,パッケージマネージャとしても用いることができる.
code:sh
$ nix-env -iA nixpkgs.nodejs
ryota-ka.icon は Homebrew をやめた.
かなりオタク向けの使い方
NixOS (Linux) や nix-darwin (macOS) を用いれば,どのようなソフトウェアがインストールされている状態を実現したいかという点まで含めて,マシンの設定を Nix Language で記述することができる.
hiroqn.icon は nix-darwin を使っている.
VS Code ユーザー向け
arrterian.nix-env-selector 拡張を使うと VS Code が nix-shell 環境下で動くようになるので便利