解决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。