我在安装软件包时发现cabal
的行为。例如,运行
cabal install funsat
安装旧版本的array
,time
,random
,quickcheck
和bitset
,打破了monadiccp
,{{1}等软件包}},hoogle
,heist
等
它可以返回snap
等,但是如何避免cabal打破已安装软件包的默认行为?在安装新软件包时,任何合理的Linux软件包管理器(如cabal install monadiccp
或aptitude
都会询问是否要破坏已安装的软件包。
是否有人制作了变通脚本?提前谢谢。
答案 0 :(得分: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 "$@"
}
因人而异;我只是对此进行了轻微测试,并且在启动时会导致恼人的延迟,因为所有依赖关系都必须计算两次。但如果你想保持安全,它应该减轻一些乏味。
答案 1 :(得分:5)
解决方法:请先检查--dry-run
。如果cabal会重新安装任何包裹,请注意。
答案 2 :(得分:2)
这是一个已知问题(请参阅this slide deck,从幻灯片22开始)。 Darcs版本的cabal-install
(darcs get http://darcs.haskell.org/cabal
)现在会在安装软件包时显示警告会破坏您的系统。例如:
$ cabal --version cabal-install version 0.13.3 using version 1.13.3 of the Cabal library $ cabal install monadiccp [...] $ cabal install funsat Resolving dependencies... In order, the following would be installed: mtl-1.1.1.1 (new version) syb-0.3.6 (new package) array-0.2.0.0 (new version) containers-0.2.0.1 (new version) bimap-0.2.4 (new package) deepseq-1.2.0.1 (reinstall) changes: array-0.3.0.2 -> 0.2.0.0 fgl-5.4.2.2 (new package) text-0.11.1.12 (reinstall) changes: array-0.3.0.2 -> 0.2.0.0 parsec-3.1.2 (reinstall) changes: mtl-2.0.1.0 -> 1.1.1.1 parse-dimacs-1.2 (new package) time-1.1.4 (new version) random-1.0.0.3 (reinstall) changes: time-1.2.0.3 -> 1.1.4 QuickCheck-1.2.0.1 -base3 (new package) bitset-0.6 (new package) funsat-0.6.1 (new package) cabal: The install plan contains reinstalls which can break your GHC installation. You can use the --avoid-reinstalls option to try to avoid this or try to ghc-pkg unregister the version of the package version to see its effect on reverse dependencies. If you know what you are doing you can use the --override-reinstall-check option to override this reinstall check.