blog.anqou.net
rss
author
tags

nix-tree で依存を調べる

Nix でソフトウェアをビルドする場合、そのソフトウェアが依存しているものを明示的に宣言する必要があるため、Nix を使わない場合と比べ依存関係を追いやすくなります。一方で、推移的に依存しているものや、あるいはどのバージョンに依存しているかなどはすぐにはよく分かりません。特に opam-nix のような洗練された仕組みを使っている場合、どのように依存解決が行われているかを追いかけるのも一苦労です[1][2]

nix-tree を使うと、その Nix build が何に依存しているかが視覚的に分かりやすく表示できます。

何も引数に渡さず nix-tree を実行すると、現在動作している NixOS のビルドの依存関係が表示されます:

nix-tree

画面は三分割されていて、依存関係の木を左右キーでたどることができるようになっています。大量に依存がある場合一つ一つ追いかけるのはつらいので / から検索モードに入って探すこともできます。また、あるソフトウェアになぜ依存しているのかを一覧したい場合は、そのソフトウェアを選択した状態で w を押すと nix why-depends のような依存関係の表示が行えます。終了する際は Esc キーを押します。

カレントディレクトリにある Nix Flake の依存関係を調べたい場合、そのソフトウェアを nix build でビルドしたうえで、以下のように packages の名前を指定します。packages.default に入っている場合は . のみで動きます。

nix-tree .#package-name

上記のコマンドではビルド結果(derivation output)の依存(≒ 実行時の依存)が表示されますが、ビルド中に依存しているものを表示したい場合は --derivation をつけます:

nix-tree --derivation .#package-name

注釈

  1. 卓越した Nix 使いであれば nix コマンド(など)を使って一瞬のうちに見つけてしまうのかも知れませんが……。

  2. ちなみに opam-nix で直接依存しているもの(推移的でないもの)を見つけるだけなら nix derivation show | jq -r '.. | .inputDrvs? // empty | keys | .[]' | cut -d'-' -f 2- | sort -u というワンライナーが便利です。