Homebrew の依存関係を表示する方法


macOS パッケージマネージャ Homebrew を使っているときに, このフォーミュラはどんなフォーミュラに依存しているのだろうかと確認したい時ってありませんか?

もしくはこのフォーミュラはどんなフォーミュラに依存されているのだろうかと確認したいときはないでしょうか.

今回はそのような Homebrew のフォーミュラの依存関係を表示する方法を紹介します.

brew deps

brew deps <formula>

brew deps <formula><formula> が依存しているフォーミュラを検索します.

例えば, 僕がいつもお世話になっている Vim がどんなフォーミュラに依存しているのか表示する場合, 次のようになります:

$ brew deps vim
gdbm
libyaml
openssl
perl
python
readline
ruby
sqlite
xz

このように Vim ってそれなりの数のフォーミュラに依存しているというのがわかりますね.

perl, python, ruby といったプログラミング言語にも依存しているんですね.

brew deps --1 <formula>

--1 というオプションを付けると, 依存しているフォーミュラを再帰的にではなく, 一つ下の階層にのみ限定して表示します:

$ brew deps --1 vim
perl
python
ruby

すると面白いことに, 今さっき触れた perl, python, ruby というプログラミング言語のフォーミュラのみ表示されました.

つまりはこれらのフォーミュラが一つ下の階層になるというわけなので, gdbm, libyaml, openssl, readline, sqlite, xz といったそのほかのフォーミュラはそれら 3 つのフォーミュラに依存されているというのがわかります.

依存の依存という関係ですね.

そのことに僕は何か人間味を感じます…

brew deps --tree <formula>

えっと --tree オプションを付けると, そのような依存の依存の関係がツリー状で表示します:

$ brew deps --tree vim
vim
├── perl
├── ruby
│   ├── libyaml
│   ├── openssl
│   └── readline
└── python
    ├── gdbm
    ├── openssl
    ├── readline
    ├── sqlite
    │   └── readline
    └── xz

ツリー状で表示されるので, Vim が依存しているフォーミュラ同士の依存関係を視覚的に確認することができます.

依存関係が手に取るようにわかりますね.

Vim にとっては readline というのは依存の依存の依存ということになりますね.

ところで, ちょっと xz という名前のフォーミュラが気になったので, brew info xz で調べてみたら:

General-purpose data compression with high compression ratio

一般目的の高い圧縮率のデータ圧縮

というように, データを圧縮するためのユーティリィなんですね.

Vim で何を圧縮しているんでしょうね, ちょっと気になります…

brew uses

brew uses <formula>

今度は brew uses <formula><formula> に依存しているフォーミュラを検索することができます.

brew deps <formula> の逆ですね.

流石に Vim に依存しているフォーミュラは見つからなかったので:

$ brew uses vim

先ほどの xz で検索してみました:

$ brew uses xz
avfs                     imagemagick              pxz                      squashfs
bcftools                 imagemagick@6            pypy3                    termrec
binwalk                  innoextract              python                   the_silver_searcher
crosstool-ng             io                       r                        vice
dpkg                     libarchive               root                     xar-mackyle
folly                    openttd                  rpm                      xdelta
gst-libav                osquery                  rpm2cpio                 zbackup
htslib                   pixz                     shogun                   zbar

このようにデータを圧縮するユーティリティだけあって色々なフォーミュラに依存されて使われています.

こういう情報が簡単に見れるって Homebrew って賢いなぁって思います.

ただ brew uses <formula><formula> に依存している Homebrew でインストール可能な全てのフォーミュラが検索されるので, サーバーとのやりとりが発生し少し時間がかかるのでそこのところは注意が必要です.

brew uses --installed <formula>

なのでインストールしたフォーミュラの中からのみ検索したいという場合には --installed オプションが使えます:

$ brew uses --installed xz
python                            the_silver_searcher               vim

すると僕がインストールしているフォーミュラの中で xz に依存しているフォーミュラはこれだけに絞られました.

当たり前ですがずいぶん絞られましたね.

何故だか the_silver_searcher が目立っているような気がして恥ずかしいです.

the_silver_searcher はまったく恥ずかしいフォーミュラではないのですが…

brew uses --recursive <formula>

で最後にちょっとだけ危険なオプション --recursive を付けると, 再帰的に検索されることになるので <formula> に依存しているフォーミュラで終わらず, さらにそのフォーミュラに依存しているフォーミュラも検索されることになります. 再帰的なのでさらに検索される可能性もあります.

xz で検索しちゃったらこんな感じになります:

$ git uses --recursive xz
arcade-learning-environment       hfstospell                        py3cairo
archivemount                      htslib                            pybind11
arx-libertatis                    httpie                            pygitup
asciinema                         iamy                              pygobject3
asciinema2gif                     imagemagick                       pypy3
aubio                             imagemagick@6                     pyqt
avfs                              innoextract                       python
aws-shell                         io                                pytouhou
awscli                            ipython                           qscintilla2
azure-cli                         iso-codes                         r
bandcamp-dl                       juju-wait                         rdup
bcftools                          jupyter                           redex
binwalk                           keepassc                          root
biogeme                           keepkey-agent                     rpm
blockhash                         khal                              rpm2cpio
boost-python3                     khard                             rtv
buku                              lensfun                           samtools
certbot                           libarchive                        scipy
conan                             libgxps                           shogun
conjure-up                        libhttpseverywhere                shyaml
corebird                          liblas                            simgrid
crosstool-ng                      libvoikko                         simple-tiles
csvkit                            macvim                            sip
csvtomd                           magic-wormhole                    siril
dartsim                           makepkg                           skafos
dcos-cli                          mapserver                         snakemake
ddgr                              mat                               snapcraft
dgen                              meson                             spaceman-diff
diffoscope                        meson-internal                    squashfs
distcc                            mgba                              submarine
dmtx-utils                        mitmproxy                         termrec
dpkg                              mps-youtube                       the_silver_searcher
dynare                            mvtools                           thefuck
eccodes                           mypy                              todoman
fades                             negfix8                           tox
fb-client                         neofetch                          traildb
fdroidserver                      nestopia-ue                       trezor-agent
file-roller                       nlopt                             ttygif
flintrock                         numpy                             twoping
folly                             nuxeo                             twtxt
fwup                              ocrmypdf                          urh
gdal                              octave                            vapoursynth
gedit                             opencv                            vcftools
geeqie                            opencv@2                          vcs
gifify                            openimageio                       vdirsyncer
git-annex                         openttd                           vice
git-cola                          osm2pgrouting                     vim
gmt                               osquery                           vim@7.4
gmt@4                             pastebinit                        vips
gnome-autoar                      pdal                              virtualpg
gnome-builder                     pdf-redact-tools                  visp
gnome-latex                       pdfsandwich                       vsts-cli
gnome-recipes                     pgrouting                         whatmp3
gnuradio                          pipenv                            xar-mackyle
googler                           pixz                              xdelta
gr-osmosdr                        points2grid                       xdot
graph-tool                        ponysay                           xonsh
grc                               postgis                           yamllint
grib-api                          pqiv                              yosys
gspell                            pre-commit                        you-get
gst-libav                         pstoedit                          zbackup
gst-python                        pxz                               zbar

はい, 一気に量が増えましたね.

検索される対象に制限がかからなくなり, サーバーとの交信時間がさらに増えることになりました.

なので --recursive を使うときはお気をつけていただければと思います.

まとめ

このように時々このフォーミュラの依存関係はどういう風になっているのかなと調べたくなったときは, brew depsbrew uses をそれぞれ使ってみていただけたらと思います.

僕は暇なときにたまにこのコマンドで遊んでいますw.

遊ぶためのコマンドではないと思いますが…

より詳しい情報は brew help deps, brew help uses で見ることができます.