2013-05-09 65 views
2

我有以下问题:管理两个依赖于彼此的cabal的库

我有两个依赖于对方的Haskell库,并且这两个库都由cabal管理。相应的阴谋文件看起来是这样的:

库1:

name:   Lib1 
version:  0.1 
cabal-version: >=1.2 
build-type:  Simple 
author:   Matthias 

library 
    hs-source-dirs: src 
    build-depends: 
       base >= 4, 
       Lib2 
    ghc-options:  -Wall 
    exposed-modules: <...> 

库2:

name:   Lib2 
version:  0.1 
cabal-version: >=1.2 
build-type:  Simple 
author:   Matthias 

library 
    hs-source-dirs: src 
    build-depends: 
       base >= 4, 
       Lib1 
    ghc-options:  -Wall 
    exposed-modules: <...> 

cabal install工程安装库(这里的库2)中的一个:

Resolving dependencies... 
In order, the following will be installed: 
Lib2-0.1 (reinstall) 
Warning: Note that reinstalls are always dangerous. Continuing anyway... 
Configuring Lib2-0.1... 
Building Lib2-0.1... 
Preprocessing library Lib2-0.1... 
Registering Lib2-0.1... 
Installing library in 
C:\Users\Matthias\AppData\Roaming\cabal\Lib2-0.1\ghc-7.4.2 
Registering Lib2-0.1... 

但试图安装其他库(这里库1)与cabal install导致产生错误信息:

Resolving dependencies... 
cabal.exe: Could not resolve dependencies: 
trying: Lib1-0.1 (user goal) 
next goal: Lib2 (dependency of Lib1-0.1) 
rejecting: Lib2-0.1/installed-aa4... (package is broken) 

有什么办法来处理彼此依赖,使我没有得到相关性错误或者是阴谋根本不能够正确处理这种情况下两个这样的库?

+3

我不认为这是永远不会工作。由于Cabal正在编译这些模块,因此您应该需要Lib1编译Lib2,反之亦然,因此都不应该先安装。老实说,我无法想象你是如何安装Lib2的 - 偶然,你有没有安装早期版本的Lib1而不依赖于Lib2?如果你这样做了,那么Cabal试图安装Lib1的时候它会破坏Lib2(这取决于Lib1)。尝试注销这两个软件包('ghc-pkg unregister')并再次尝试 - 我怀疑它会给出一组更清晰的错误。 – isturdy 2013-05-09 15:19:52

+6

如果你甚至可以让它工作,循环依赖只会导致麻烦。通过将一些内容从一个包转移到另一个包,将通用代码提取到第三个包中,或者将这些包加入到一个包中来打破这个循环。 – hammar 2013-05-09 15:24:54

回答

5

正如其他人所说的,循环依赖在Cabal中永远不会起作用。编译模块具有循环依赖性是很困难的,但是一个无望的原因。

有时候可能很烦人,但唯一真正的解决方案是找到一种方式来打破循环依赖。