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

时间:2012-01-10 03:28:11

标签: haskell ghc cabal

我在安装软件包时发现cabal的行为。例如,运行

cabal install funsat

安装旧版本的arraytimerandomquickcheckbitset,打破了monadiccp,{{1}等软件包}},hoogleheist

它可以返回snap等,但是如何避免cabal打破已安装软件包的默认行为?在安装新软件包时,任何合理的Linux软件包管理器(如cabal install monadiccpaptitude都会询问是否要破坏已安装的软件包。

是否有人制作了变通脚本?提前谢谢。

3 个答案:

答案 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-installdarcs 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.