Search code examples
haskellghccabalcabal-installghc-pkg

Is there a way to find why cabal installed a certain package?


When installing a package with cabal-install, it will also indirectly install all the dependencies. Given a certain package in my .cabal/packages folder that I didn't directly install, is there a way to find what other package(s) it was a dependency of?


Solution

  • I found this command somewhere (can't remember where now) and use it regularly to produce a dependency graph of my installed packages:

    ghc-pkg dot | tred | dot -Tpng > pkgs.png
    

    Note that it's actually ~/.ghc which contains the installed package information, rather than ~/.cabal.

    You can also use:

    ghc-pkg unregister <pkgname>
    

    which will print a list of packages which would break if you uninstalled this package, which is effectively what you are looking for:

    $ ghc-pkg unregister aeson
    ghc-pkg: unregistering aeson would break the following packages: criterion-0.8.0.0 yesod-1.2.4 .... (use --force to override)
    

    Update

    Using dot -Tsvg > pkgs.svg in the above command also allows you to use text searches (if you open the file in a browser, for example).

    Also, the cab utility is very useful for showing dependencies and reverse dependencies, amongst other things.

    For stack users stack dot --external can be used from your project directory in place of the above ghc-pkg dot.