"cabal install ___"中断以前安装的软件包



我发现cabal在安装包时的行为令人抓狂。例如,运行

cabal install funsat

安装了旧版本的arraytimerandomquickcheckbitset,破坏了monadiccphoogleheistsnap等软件包。

它可以返回和cabal install monadiccp等,但我如何避免阴谋集团破坏已安装包的默认行为?任何合理的Linux软件包管理器,如aptitudezypper,在安装新软件包时都会询问是否要破坏已安装的软件包。

有人想出一个变通的脚本吗?提前谢谢。

我推荐cabal dev,它为您处理的每个项目维护一组单独的安装包。这并不能解决cabal安装的不良行为,但意味着这些故障比其他情况下更孤立,并且可以通过简单地执行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 "$@"
}

YMMV;我只是对它进行了轻微的测试,它在启动时会导致令人讨厌的延迟,因为所有的依赖关系都必须计算两次。但是,如果你想安全起见,它应该可以缓解一些乏味。

解决方法:始终首先使用--dry-run进行检查。如果阴谋集团要重新安装任何包裹,请小心。

这是一个已知的问题(请参阅本幻灯片组,从幻灯片22开始)。Darcs版本的cabal-installdarcs get http://darcs.haskell.org/cabal)现在在安装软件包会破坏系统时显示警告。示例:

$cabal—版本cabal安装版本0.13.3使用Cabal库的1.13.3版本$cabal安装monadiccp[…]$cabal安装funsat正在解析依赖项。。。按照顺序,将安装以下内容:mtl-1.1.1.1(新版本)syb-0.3.6(新包装)array-0.2.0(新版本)containers-0.2.0.1(新版本)bimap-0.2.4(新软件包)deepseq-1.2.0.1(重新安装)更改:array-0.3.0.2->0.2.0.0fgl-5.4.2.2(新包装)text-0.111.1.12(重新安装)更改:阵列-0.3.0.2->0.2.0.0parsec-3.1.2(重新安装)更改:mtl-2.0.>1.1.1.1parse-dimacs-1.2(新软件包)时间1.1.4(新版本)random-1.0.0.3(重新安装)更改:时间1.2.0.3->1.1.4QuickCheck-1.2.0.1-base3(新软件包)bitset-0.6(新软件包)funsat-0.6.1(新套装)阴谋集团:安装计划包含重新安装,这可能会破坏你的GHC安装您可以使用--avoid重新安装选项来尝试避免这种情况,或者尝试到ghc pkg注销软件包版本的版本以查看其效果关于反向依赖关系。如果你知道自己在做什么,你可以使用使用--override重新安装检查选项来覆盖此重新安装检查

最新更新