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

Dan*_*ton 39 dependencies haskell ghc

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

Dan*_*her 30

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

$ ghc-pkg unregister --user borken
Run Code Online (Sandbox Code Playgroud)

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

无论哪种方式,您将丢失仍然想要使用的包,因此您将尝试重新安装它们而不会重新打破任何内容.跑

$ cabal install world --dry-run
Run Code Online (Sandbox Code Playgroud)

这将尝试为您安装的所有软件包生成一致的安装计划cabal-install.如果它没有这样做,它将打印出原因,然后你可以通过向world文件(~/.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.-any在世界文件中用"<0.12" 替换hmatrix上的"约束"产生了一个干净的安装计划.
因此,在对世界文件中的约束进行一些调整之后,您将从cabal获得安装计划.检查是否会重新安装您已经拥有的任何软件包(安装较新版本可能没问题,重新安装相同版本意味着麻烦).如果你对cabal的安装计划感到满意,cabal install world并且在GHC忙碌的时候泡好一壶茶.ghc-pkg check再次运行,验证一切正常.

一条通常很好的建议:如果您不知道安装包的内容,请始终先使用--dry-run.

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

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


Sim*_*ael 15

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

但是今天,我找到了ghc-pkg-autofix,它可以自动完成这个进一步破坏的软件包.我不知道它做了什么,YMMV.

  • 从描述和简短的源代码看,`ghc-pkg-autofix`在`〜/ .ghc /.../ package.conf.d/package`中重写依赖信息.这是一个危险的操作,可能会以阴险的方式破坏事物,但它的工作原理很快.正如描述所说,_使用风险_.您的脚本看起来更安全.但是如果你像我一样安装了多个GHC,ghc-pkg-clean只会处理链接到ghc的那个(很容易修改脚本以获取ghc-pkg使用的参数)和ghc-pkg-reset将他们全部核对.所以,不适合我,但我很奇怪.+1表示自动帮助. (4认同)