解决ghc-pkg检查logging的问题

ghc-pkg check会列出损坏的软件包,以及它们为什么被破坏。 但据我所知,没有自动化的方式来照顾那些破损的包裹。 什么是处理破包的build议方式? (最好不要重新安装GHC)

希望你已经足够聪明,不要在你的全局包数据库中弄坏任何东西。 破损在那里很容易意味着重新安装GHC是必要的。 所以,让我们假设破坏被限制在用户软件包数据库(用户软件包映射的全局数据包中可能包含一个或两个软件包除外)。 如果只有很less的包被破坏,你可以通过取消注册违规包来修复你的设置,

 $ ghc-pkg unregister --user borken 

那往往会抱怨说注销borken会打破其他包裹。 无论您是先尝试注销那些还是立即注销borken,然后再重新破解大多是一个select的问题。 确保只从用户数据库取消注册包。 如果情况不是太严峻,在注销一些软件包之后, ghc-pkg check将报告没有更多的被破坏的软件包。
另一方面,如果大部分软件包损坏,那么可能会更容易完全擦除用户数据库$ 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告诉我它不能configurationvector-algorithms-0.5.2 ,它依赖于vector >= 0.6 && < 0.8 (我有vector-0.7.1已安装)。 原因是hmatrix-0.12.0.1需要vector >= 0.8 。 在hmatrix上用“<0.12”取代-any “约束”产生了一个干净的安装计划。
所以,在世界文件的一些约束之后,你会从cabal得到一个安装计划。 检查是否会重新安装已有的软件包(安装较新的版本可能是好的,重新安装相同的版本意味着麻烦)。 如果您对cabal的安装计划感到满意,那么在GHC忙碌的情况下,您可以cabal install world并泡上一壶好茶。 再次运行ghc-pkg check ,validation所有是否正确。

一个普遍好的build议:如果你不知道安装一个软件包需要什么, 总是先使用–dry-run。

如果通过与cabal进行全局安装来破坏全局包数据库,则注销违规者的策略可能会奏效,但它也可能会不可逆转地打破您的ghc,这取决于哪种方式被破坏。 如果你通过从你的操作系统发行版安装软件包来破坏你的全局分区,那么安装一个新的GHC,诅咒发行版软件包,并且试着帮助它们阻止进一步的这种事件。

一个cabal repair命令将是非常好的,但目前,修复一个破碎的设置不幸的是更多的工作。

有一段时间我依靠这个ghc-pkg-clean脚本 。 它会删除所有破损的包,并根据需要重新安装。 对于更严重的破损,我使用ghc-pkg-reset脚本 。

但今天,我发现ghc-pkg-autofix会自动执行这个进一步破解的软件包。 我不知道它是什么,YMMV。