Nix Store
Localで、install済みのnixのpackageが置かれる場所のことのことをNix Storeと呼ぶ
通常は/nix/storeにある
配下にめちゃくちゃたくさんのdirやfileがある
$ ls /nix/store | grep hogeとかで探せる
これらのdirectoryのことをstore pathと呼ぶ ref
packageやprofileが全て並列に配置されている
そのため、package間に依存があっても兄弟を見るだけで済む
そのため、入れ子や共通するpackageの共有などによって生じるDependency hellが起こらない
Nix Store内で管理されているもの
install済みのpackage
同一packageでも異なるversionのものは互いに干渉せず独立に並列にstore下に配置されている
厳密には「異なるversion」ではなく「異なるhash」のものである
同じversionでもhashが異なるものがたまにあるらしいmrsekut.icon
例えばmrsekut.iconのlocalで以下を実行してみると
同じversionのexaが2つ存在する
code:bash
$ ls /nix/store/*exa*/bin
/nix/store/8yawf1v4fbi3xab9r3cs85i5y6dclr99-exa-0.10.1/bin:
exa
/nix/store/fidnwrf9kk9b3pqvdg7wvpgnvkfjq3pc-exa-0.10.1/bin:
exa
User environments
ref NixのProfile
store derivation
Store配下にあるのはhash-nameという形式のもの ref
例えば/nix/store/s4zia7hhqkin1di0f187b79sa2srhv6k-bash-4.2-p45/
これはdirectoryであり、bin/bashを含んでいる
binだけなく、ソースコードや、その依存、compiler flagを含んでいたりもする
bin/bashが、store直下ではなく、hash-nameの下にあるのがポイント
storeには、self-containedなbuild出力のみがある
実際にはbashを実行すると、hash-name/bin/bashが呼ばれる
この辺のpathの解決もnixがよしなにやってくれる
同一packageでもversionが異なるものは異なるモノとしてstoreに置かれる
s4zia7...hv6k-bash-4.2-p45/の4.2のようなversion番号は、
derivationの名前であって、それがuniqueであるという意味ではないことに注意
uniqueなことに意味があるのはhashの方だけ
https://nixos.org/manual/nix/stable/figures/user-environments.png https://nixos.org/manual/nix/stable/#sec-profiles
これはNixのProfileの説明の図だが、最右列がstore
subversionのv1.1.2とv1.1.3があるが、それらは並列に配置されている
https://nixos.org/manual/nix/unstable/command-ref/nix-store.html
commandのoptionとか
nix storeから不要なものを削除する
NixのGC
--query, -q
https://nixos.org/manual/nix/unstable/command-ref/nix-store.html#operation---query
--requisites, -R
NixのClosureを表示する
$ nix-store -qR
--references \`which exa\`
https://nixos.org/guides/nix-pills/enter-environment.html#idm140737320681936
説明を読んでもいまいちよくわからないmrsekut.icon
こういう結果が得られたとして何を意味するんだ
code:result
$ nix-store -q --references which hello
/nix/store/fg4yq8i8wd08xg3fy58l6q73cjy8hjr2-glibc-2.27
/nix/store/58r35bqb4f3lxbnbabq718svq9i2pda3-hello-2.10
helloが依存している者たちのstore pathが表示されているということ #??
結果がいっぱい出てくるのはなんでだ #??
どのコマンドで試してみても同じ結果になるのはhome-managerを使っているから #??
--referrers \`which exa\`
このexaが使われている場所を表示する
結果に表示されるものが、exaに依存していることを表す
λ nix-store --query --referrers <path>
tree viewer
https://github.com/cdepillabout/nix-query-tree-viewer
https://stephank.nl/p/2020-06-01-a-nix-primer-by-a-newcomer.html#:~:text=is%20a%20derivation.)-,Nix%20store,-This%20is%20the