Cabal 无法安装依赖项,但如果直接询问则可以安装它们

Cabal fails to install dependencies, but can install them if asked directly

我发现 Cabal 有一个非常奇怪的反复出现的问题,它干扰了我获得可重复 Haskell 构建的能力。我有一个带有沙箱的阴谋集团项目。如果我这样做 cabal install,我会收到形式为

的错误

Y failed during the building phase. The exception was: ExitFailure 1 X depends on Y which failed to install.

其中 X 是我项目的直接依赖项,Y 是一些传递依赖项。但是,如果我只输入 cabal install X,那么它就可以工作了!

这里有一个具体的例子:我的项目依赖于interpolate包。当我执行 cabal install --allow-newer 时,我得到这样的错误:

Resolving dependencies...
Configuring haskell-src-meta-0.6.0.9...
Building haskell-src-meta-0.6.0.9...
Preprocessing library haskell-src-meta-0.6.0.9...
[1 of 6] Compiling Language.Haskell.TH.Instances.Lift ( src/Language/Haskell/TH/Instances/Lift.hs, dist/dist-sandbox-d2861272/build/Language/Haskell/TH/Instances/Lift.o )
[2 of 6] Compiling Language.Haskell.Meta.Syntax.Translate ( src/Language/Haskell/Meta/Syntax/Translate.hs, dist/dist-sandbox-d2861272/build/Language/Haskell/Meta/Syntax/Translate.o )
[3 of 6] Compiling Language.Haskell.Meta.Parse ( src/Language/Haskell/Meta/Parse.hs, dist/dist-sandbox-d2861272/build/Language/Haskell/Meta/Parse.o )
[4 of 6] Compiling Language.Haskell.Meta.Parse.Careful ( src/Language/Haskell/Meta/Parse/Careful.hs, dist/dist-sandbox-d2861272/build/Language/Haskell/Meta/Parse/Careful.o )
[5 of 6] Compiling Language.Haskell.Meta ( src/Language/Haskell/Meta.hs, dist/dist-sandbox-d2861272/build/Language/Haskell/Meta.o )
[6 of 6] Compiling Language.Haskell.Meta.Utils ( src/Language/Haskell/Meta/Utils.hs, dist/dist-sandbox-d2861272/build/Language/Haskell/Meta/Utils.o )

src/Language/Haskell/Meta/Utils.hs:67:1:
    Duplicate instance declarations:
      instance Typeable Q
        -- Defined at src/Language/Haskell/Meta/Utils.hs:67:1
      instance Typeable Q -- Defined in ‘Language.Haskell.TH.Instances’

src/Language/Haskell/Meta/Utils.hs:71:1:
    Duplicate instance declarations:
      instance Typeable QuasiQuoter
        -- Defined at src/Language/Haskell/Meta/Utils.hs:71:1
      instance Typeable QuasiQuoter
        -- Defined in ‘Language.Haskell.TH.Instances’
Failed to install haskell-src-meta-0.6.0.9

...

haskell-src-meta-0.6.0.9 failed during the building phase. The exception was:
ExitFailure 1
interpolate-0.1.0 depends on haskell-src-meta-0.6.0.9 which failed to install.

但是,如果我继续键入 cabal install interpolate-0.1.0,安装 成功 并且我可以继续安装我的项目。

这很令人沮丧,因为我必须 "manually" 安装几个包才能安装所有依赖项。原始安装因编译器错误而失败的事实似乎表明编译器的配置有所不同?

我正在使用 GHC 7.8.3 和 cabal-install 1.22.4.0(Cabal 库的版本 1.22.3.0)。非常感谢您的帮助!

实际上这不是 haskell-src-meta 版本的问题,而是其依赖项 th-orphans.

版本的问题

haskell-src-meta(版本 0.6.0.8 和 0.6.0.9)具有上限 th-orphans <0.12.

使用 --allow-newer 你告诉 Cabal 忽略版本上限,所以 Cabal 决定使用 th-orphans 版本 0.12.0,因为它更新并且可能更好。但是,事实上,haskell-src-meta 确实没有使用 th-orphans 版本 0.12.0 构建,正如您发现的那样。

无限制使用--allow-newer一般情况下很可能运行变成这种问题。最好用 --allow-newer=base,containers,... 指定要忽略其上限的包,尽管在某些情况下这样做会相当乏味。

在您问题的第一句话中,您提到了可重复构建。如果那是您想要的,那么除了简单地记录您想要的所有直接和间接依赖项的确切版本之外,别无他法。