没有"cabal升级"的最佳解决方法是什么?

gat*_*ado 37 haskell cabal

我想升级所有包,而不仅仅是特定的包cabal install --upgrade-dependencies.

acf*_*zer 51

在OS X上,这个shell hackery对我有用:

cabal list --simple-output --installed | awk '{print $1}' | uniq | xargs -I {} cabal install {} --reinstall
Run Code Online (Sandbox Code Playgroud)

编辑:现在强制重新安装,并避免在存在多个版本时多次安装包.感谢您的评论!

编辑年代:现在Cabal沙箱和Stack存在,我强烈建议不要尝试升级软件包.如果您只是擦除现有的沙箱并重新安装最新的依赖项,那么您最终会遇到更少的麻烦.

  • 在'awk`步骤之后不应该有`uniq`过滤器吗?至少在我的环境中,它会使用相同的参数多次调用`cabal install` ...同样,可能不希望升级与GHC捆绑在一起的系统库,例如`base` (4认同)
  • 不要忘记最后一个`cabal install`命令的`--reinstall`标志. (2认同)
  • 据我所知,`cabal install`就在于此.更好的方法是使用`ghc-pkg list --user`,因此您永远不会触及GHC全局包. (2认同)

Tob*_*obu 7

.cabal/world文件包含显式安装的每个软件包的列表(在cabal install命令中列出,而不是通过依赖项).修剪它以删除仅作为依赖项使用的包,不推荐使用的包以及您宁愿升级的版本锁定包.

Cabal不知道如何清理自己,但你可以删除几乎所有东西.下一个命令将从.cabal/packages(tarball缓存)重新安装:

cp -t bin .cabal/bin/cabal
rm -rf .cabal/{bin,lib,share} .ghc/*-*-*/
ghc-pkg check |&egrep -- '^[A-Za-z0-9-]+-[0-9]' |xargs -n1 --no-run-if-empty ghc-pkg unregister
Run Code Online (Sandbox Code Playgroud)

现在重新安装手动安装的所有内容:

cabal install world --upgrade-dependencies --force-reinstalls
Run Code Online (Sandbox Code Playgroud)