解决ghc-pkg检查中发现的问题

时间:2011-11-01 01:27:00

标签: haskell dependencies ghc

ghc-pkg check列出破损的包裹以及它们被破坏的原因相当不错。但据我所知,没有自动化的方法来处理那些破损的包裹。处理破损包裹的推荐方法是什么? (最好不要重新安装GHC)

2 个答案:

答案 0 :(得分:30)

希望您已经足够明智,不会破坏全局包数据库中的任何内容。那里的破损很容易意味着重新安装GHC是必要的。因此,让我们假设破坏仅限于用户包db(除了可能是由用户包遮蔽的全局中的一个或两个包)。如果只有少数软件包损坏,您可以通过取消注册有问题的软件包来修复您的设置,

$ ghc-pkg unregister --user borken

经常会抱怨未注册的borken会打破其他包裹。无论您是先尝试取消注册,还是使用--force立即取消注册borken,然后处理新破坏的主要是选择问题。 确保您只从用户数据库中取消注册软件包。如果事情不是很严重,取消注册一些软件包后,ghc-pkg check将报告不再有破坏的软件包。
另一方面,如果大部分软件包被破坏,则可能更容易完全擦除用户db,$ rm -rf ~/.ghc/ghc-version/package.conf.d或其他操作系统上的等效软件。

无论哪种方式,您都会丢失您仍想使用的软件包,因此您将尝试重新安装它们而不会重新打破任何内容。运行

$ cabal install world --dry-run

将尝试为使用cabal-install安装的所有软件包生成一致的安装计划。如果它没有这样做,它将打印出原因,然后您可以通过向世界文件(~/.cabal/world)中列出的包添加约束来解决问题 - 例如,虽然我没有破坏包(根据ghc / ghc-pkg),cabal install world --dry-run告诉我它无法配置vector-algorithms-0.5.2,这取决于vector >= 0.6 && < 0.8(我安装了vector-0.7.1)。原因是hmatrix-0.12.0.1需要vector >= 0.8。在世界文件中用“&lt; 0.12”替换hmatrix上的-any“约束”产生了一个干净的安装计划。
因此,在对世界文件中的约束进行一些调整之后,您将从cabal获得安装计划。检查是否会重新安装您已经拥有的任何软件包(安装较新版本可能没问题,重新安装相同版本意味着麻烦)。如果你对cabal的安装计划感到满意,cabal install world并在GHC忙碌的时候泡一壶好茶。再次运行ghc-pkg check,验证所有内容是否正常。

一条通常很好的建议:如果你不知道安装包的内容,总是首先使用--dry-run。

如果您通过使用cabal进行全局安装来破坏您的全局包数据库,取消注册违规者的策略可能会起作用,但它也可能会不可逆转地破坏您的ghc,这取决于以哪种方式破坏。如果您通过从操作系统发行版安装软件包来破坏全局数据库,请安装新的GHC,诅咒发行版包装程序,并尝试帮助他们防止此类事件的发生。

cabal repair命令非常好,但目前修复破损的设置还不止于此。

答案 1 :(得分:15)

有一段时间我一直依赖这个ghc-pkg-clean script。它删除所有损坏的包,然后根据需要重新安装它们。对于更严重的破损,我使用ghc-pkg-reset script

但是今天,我发现了ghc-pkg-autofix,它可以自动完成这一过程 - 破坏的软件包不会中断。我不知道它的作用,YMMV。