有没有办法找到为什么cabal安装了某个包?

时间:2014-01-04 22:04:43

标签: haskell ghc cabal cabal-install ghc-pkg

使用cabal-install安装软件包时,它还会间接安装所有依赖项。鉴于我的.cabal/packages文件夹中有一个我没有直接安装的软件包,有没有办法找到它所依赖的其他软件包?

2 个答案:

答案 0 :(得分:15)

我在某个地方发现了这个命令(现在不记得了)并定期使用它来生成我安装的软件包的依赖图:

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

请注意,它实际上是~/.ghc,其中包含已安装的包信息,而不是~/.cabal

您也可以使用:

ghc-pkg unregister <pkgname>

将打印一个包列表,如果你卸载了这个包,它会破坏,这实际上是你正在寻找的:

$ 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)

更新

在上述命令中使用dot -Tsvg > pkgs.svg还允许您使用文本搜索(例如,如果您在浏览器中打开文件)。

此外,cab实用程序对于显示依赖项和反向依赖项等非常有用。

对于堆栈用户,可以在项目目录中使用stack dot --external代替上述ghc-pkg dot

答案 1 :(得分:3)

我发现cabal-db有帮助。例如,您可以运行

cabal-db revdeps semigroupoids

它会告诉你

zippers: semigroupoids (>=4 && <5)
wl-pprint-extras: semigroupoids (>=3 && <5)
vector-instances: semigroupoids (>=3)
validation: semigroupoids (>=4.0)
transformers-abort: semigroupoids (>=1.2)
these: semigroupoids (>=1.0 && <4.1)

等...