为什么cabal认为我需要一个旧图书馆?

时间:2014-06-22 16:04:13

标签: haskell cabal cabal-install

我刚刚开始新鲜,我在package.conf.d删除了~/.ghc/x86_64-linux-7.8.2

当我尝试安装numeric-prelude时,cabal会尝试安装旧版本的mtl,即使我已经检查了所有依赖项并且可以使用最新的mtl。< / p>

这是一个较小的例子,展示了(希望)相关的问题:

$ cabal install QuickCheck parsec --dry-run
Resolving dependencies...
In order, the following would be installed (use -v for more details):
mtl-2.1.3.1 (latest: 2.2.1)
primitive-0.5.3.0
random-1.0.1.1
text-1.1.1.3
parsec-3.1.5
tf-random-0.5
QuickCheck-2.7.5

但可以自行安装:

$ cabal install QuickCheck --dry-run
Resolving dependencies...
In order, the following would be installed (use -v for more details):
primitive-0.5.3.0
random-1.0.1.1
tf-random-0.5
QuickCheck-2.7.5

$ cabal install parsec --dry-run
Resolving dependencies...
In order, the following would be installed (use -v for more details):
text-1.1.1.3
transformers-0.4.1.0
mtl-2.2.1
parsec-3.1.5

并且都不需要mtl-2.1.3.1

问题与numeric-prelude类似:我使用mtl-2.2安装了所有列出的依赖项而没有问题。然后,当我尝试安装numeric-prelude时,cabal会尝试安装旧版mtl

我认为,即使我已经堵塞了我的cabal pacakges,删除用户package.conf.d也会解决这个问题。那么我的阴谋集团仍然被淹没,或者还有其他事情发生在这里?

1 个答案:

答案 0 :(得分:4)

我可以&#34;修复&#34;这在我的机器上说:

cabal install QuickCheck parsec --constraint="transformers == 0.4.*"

在这种情况下的问题是QuickCheck依赖于变换器,并且首选是选择已安装的版本,即transformers-0.3.0.0。但是这种transformers的选择现在与选择最新的mtl不一致。现在,Cabal必须选择违反两个偏好中的哪一个(选择transformers的更高版本来构建QuickCheck,或者选择较旧版本的mtl)。它随机选择一个,在这种情况下,这恰好不是你想要的那个......添加额外的约束会有所帮助。

修改

对于numeric-prelude,情况略有不同。最新版本的numeric-prelude取决于storable-recordtransformers < 0.4明确取决于numeric-prelude。但parsec还取决于mtl,这取决于mtl。因此,您无法将其与最新的{{1}}一起使用。