Dependency visualization

You can use stack to visualize the dependencies between your packages and optionally also external dependencies.

As an example, let's look at wreq:

$ stack dot | dot -Tpng -o wreq.png

wreq

Okay that is a little boring, let's also look at external dependencies:

$ stack dot --external | dot -Tpng -o wreq.png

wreq_ext

Well that is certainly a lot. As a start we can exclude base and then depending on our needs we can either limit the depth:

$ stack dot --no-include-base --external --depth 1 | dot -Tpng -o wreq.png

wreq_depth

or prune packages explicitly:

$ stack dot --external --prune base,lens,wreq-examples,http-client,aeson,tls,http-client-tls,exceptions | dot -Tpng -o wreq_pruned.png

wreq_pruned

Keep in mind that you can also save the dot file:

$ stack dot --external --depth 1 > wreq.dot
$ dot -Tpng -o wreq.png wreq.dot

and pass in options to dot or use another graph layout engine like twopi:

$ stack dot --external --prune base,lens,wreq-examples,http-client,aeson,tls,http-client-tls,exceptions | twopi -Groot=wreq -Goverlap=false -Tpng -o wreq_pruned.png

wreq_pruned

Specifying local targets and flags

The dot and list-dependencies commands both also accept the following options which affect how local packages are considered:

  • TARGET, same as the targets passed to build
  • --test, specifying that test components should be considered
  • --bench, specifying that benchmark components should be considered
  • --flag, specifying flags which may affect cabal file build-depends