我发现cabal
在安装包时的行为令人抓狂。例如,运行
cabal install funsat
安装了旧版本的array
、time
、random
、quickcheck
和bitset
,破坏了monadiccp
、hoogle
、heist
、snap
等软件包。
它可以返回和cabal install monadiccp
等,但我如何避免阴谋集团破坏已安装包的默认行为?任何合理的Linux软件包管理器,如aptitude
或zypper
,在安装新软件包时都会询问是否要破坏已安装的软件包。
有人想出一个变通的脚本吗?提前谢谢。
我推荐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-install
(darcs 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重新安装检查选项来覆盖此重新安装检查