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

tom*_*tom 2 haskell cabal cabal-install

我看到一个非常奇怪的反复出现的问题,Cabal干扰了我获得可重复的Haskell构建的能力.我有一个带沙盒的cabal项目.如果我这样做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.
Run Code Online (Sandbox Code Playgroud)

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

这很令人沮丧,因为在我可以安装所有依赖项之前,我必须"手动"安装多个软件包.原始安装因编译器错误而失败的事实似乎表明编译器以某种方式配置不同?

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

Rei*_*ton 5

实际上它不是版本的问题,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,...,但在某些情况下这样做可能相当繁琐.

在您的问题的第一句中,您提到了可重复的构建.如果这就是您想要的,那么只需记录您想要的所有直接和间接依赖关系的确切版本就没有任何替代品.