我看到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.
然而,如果我继续输入cabal install interpolate-0.1.0
,安装会成功,我就可以继续安装我的项目了。
这很令人沮丧,因为在我可以安装所有依赖项之前,我必须“手动”安装多个软件包。原始安装因编译器错误而失败的事实似乎表明编译器以某种方式配置不同?
我正在使用GHC 7.8.3和cabal-install 1.22.4.0(Cabal库的1.22.3.0版本)。非常感谢您的帮助!
答案 0 :(得分: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,...
指定要忽略其上限的包,但在某些情况下这样做可能相当繁琐。
在你的问题的第一句中,你提到了可重复的构建。如果这就是你想要的,那么就没有什么可以替代简单地记录你想要的所有直接和间接依赖的确切版本。