Nix
https://nix.dev
https://nixos-and-flakes.thiscute.world/
https://github.com/NixOS/nix
イメージが掴めなくて理解できないことが多い
Fetcherは事前にダウンロード予定のコンテンツのハッシュ値を指定しておき、Fetcher実行時にハッシュの異なるコンテンツがダウンロードされた場合異常終了させる
ハッシュの異なるコンテンツがダウンロードされる場合がある?
純粋関数的ビルドシステムである
参照透過性がある
subeffects がない
どの環境でも完全再現が可能
Nix Fetcher
Nix のサンドボックス環境はインターネットにアクセスできない
それは副作用であり純粋関数的でなくなってしまう
Fetcher は参照透過性がある
ダウンロード予定のリソースのハッシュ値を指定するから
Fetcherは1つだけではなく、GitHubからソースコードをダウンロードするFetcherなど用途ごとにFetcherがある
Nixストアによるパッケージと依存関係の厳密な管理
すべてのものはNixストアに格納される
グローバルインストールも、実体は /nix/store/ に入る
~/.nix-profile/bin/ にシンボリックリンクが貼られている
これはローカルストアの話
ハッシュ値で厳密に管理される
Nixからはバージョン(ハッシュ値)が違うものはすべて別物
暗黙的な依存関係は許されない
Nix言語とFlakesによる宣言的ビルド
これも環境を完全再現できる要素
Profilesによる非破壊的パッケージ構成管理
世代機能
アップデートするのではなく新規にビルドする
ロールバックのときは前の世代にリンクし直せば良い
Nix Substituter
代替者
ローカルストアになかった場合ここのストアを参照することでビルドスキップができる
これを使った場合のビルド手順
1. ストアパス生成
2. ローカルストアにビルド済みストアオブジェクトが存在するか確認(存在すればビルドスキップ)
3. Substituterにビルド済みストアオブジェクトが存在するか確認(存在すればビルドをスキップし、Substituterのストアオブジェクトをローカルストアに取得
4. ローカルストアにもSubstituterにも存在しなかった場合はビルド実行
store derivation
Nixストアに格納された .drv ファイルのこと
これも一意なストアパスがある
stdenv
Standard Environment
gcc とか coreutils とか スタンダードなパッケージが複数ある
Nix Shell
https://zenn.dev/asa1984/books/nix-hands-on/viewer/ch02-01-nix-cli-basics#nix-shell
nix-shell はレガシーなので使わない!
code:terminal
nix shell nixpkgs#hello
そのパッケージが入った一時的な環境が構築される
exit で nix shell を抜ける
もし恒久的にインストールしたいなら nix profile add nixpkgs#hello
https://zero-to-nix.com
zero to nix
#パッケージマネージャー