"cabal install ___"打破了之前安装的软件包

gat*_*ado 5 haskell ghc cabal

我发现cabal安装包令人抓狂时的行为.例如,跑步

cabal install funsat
Run Code Online (Sandbox Code Playgroud)

安装旧版本array,time,random,quickcheck,和bitset,破包,比如monadiccp,hoogle,heist,snap,等.

它可以返回cabal install monadiccp等等,但是如何避免cabal破坏已安装软件包的默认行为?在安装新软件包时,任何合理的Linux软件包管理器,aptitude或者zypper我是否要破坏已安装的软件包.

有人制作了一个变通脚本吗?提前致谢.

ehi*_*ird 8

我建议使用cabal-dev,它为您正在处理的每个项目维护一组单独的已安装软件包.这并不能解决cabal-install的不良行为,但这意味着这些故障比其他情况更加孤立,并允许您通过简单的操作更轻松地修复它们cabal-dev clean && cabal-dev install.

可重复构建的额外好处也很好.

不可否认,这不是针对您的具体问题的解决方法,但它通常会减轻阴茎安装的痛苦.


在Daniel Fischer的回答的基础上,cabal如果它将重新安装一个包,这里的包装将中止安装:

cabal () {
  if [ "$1" = "install" ]; then
    local out=$(command cabal --dry-run -v2 "$@" 2>&1)
    if echo "$out" | egrep -c '\((reinstall|new version)\)' >/dev/null; then
      echo "$out"
      return 1
    fi
  fi
  command cabal "$@"
}
Run Code Online (Sandbox Code Playgroud)

因人而异; 我只是对此进行了轻微测试,并且在启动时会导致恼人的延迟,因为所有依赖关系都必须计算两次.但如果你想保持安全,它应该减轻一些乏味.


Dan*_*her 5

解决方法:始终先检查--dry-run.如果cabal会重新安装任何包裹,请注意.