Untangling Your Homebrew Dependencies
Does this look familiar?
$ brew ls | wc -l
217
Wait, what? When did this happen?!
You can try looking at the brew ls
output and try to remember what you
installed when. Your next reflex is probably to search “homebrew dependencies”
because there must be an easy solution…
The Basics
What are vim’s dependencies?
$ brew deps vim
perl
python
ruby
Hmmm… what depends on perl?
$ brew uses perl --installed # --installed is important, otherwise ALL packages are considered
vim
How can I see all dependencies?
$ brew deps --installed
apg:
bash-completion:
cairo: fontconfig freetype glib libpng pixman
coreutils:
dirmngr: libassuan libgcrypt libgpg-error libksba pth
dnsmasq:
docker:
dos2unix:
ffmpeg: lame x264 xvid
findutils:
## truncated ##
The Real Question: What Can I Uninstall?
You can uninstall packages no other packages depend on. Thankfully, there’s a command for that:
$ brew leaves
apg
bash-completion
coreutils
dnsmasq
docker
dos2unix
ffmpeg
findutils
fswatch
gawk
## truncated ##
but here’s some bad news… brew leaves
is broken!
$ brew leaves | grep perl
perl
but, if you remember from above:
$ brew uses perl --installed
vim
# or
$ brew deps --installed | grep perl
perl:
vim: perl python ruby
brew leaves
tells you nobody uses perl, but brew uses
confirms that vim uses perl…
Detour: Dependencies and Requirements
Let’s look at vim info:
There are two sections: “dependencies” and “requirements” … so, what’s the difference?
dependency: a "real" package you depend on
requirement: an "alias" for one of multiple substitute packages
For example: vim needs perl, but it’s not picky about which perl is installed.
If you brew search perl
, you’ll find you have many options; all of which
satisfy vim’s “requirement”.
Brew Leaves is Broken
To make a long story short, brew leaves
only lists dependencies (but not
requirements).
There are a bunch of homemade solutions
out there. I went through homebrew’s code and brew deps --installed
is the
complete source of truth.
$ brew deps --installed
apg:
bash-completion:
cairo: fontconfig freetype glib libpng pixman
coreutils:
dirmngr: libassuan libgcrypt libgpg-error libksba pth
dnsmasq:
docker:
dos2unix:
ffmpeg: lame x264 xvid
findutils:
## truncated ##
A leaf is a package that never shows up on the right side of the colon.
brew-graph
If you feel that the output of brew deps --installed
is not friendly, you’re not alone.
brew-graph is a ruby script that uses the output of brew deps --installed
and generates a graph, in GraphViz or GraphML format. After you install brew-graph, you can visualize your dependencies:
$ brew install graphviz
$ brew graph --installed | dot -T png -o graph.png
$ open graph.png
I think you can get better results by using fdp
, instead of dot
, to
generate the image. fdp
is already installed if dot
is installed; they are
both part of GraphViz. The man page says:
… fdp draws undirected graphs using a ‘‘spring’’ model. It relies on a force-directed approach in the spirit of Fruchterman and Reingold …
I would also recommend the new --highlight-leaves
option to color (in gray) packages that can be uninstalled:
$ brew graph --installed --highlight-leaves | fdp -T png -o graph.png
$ open graph.png