2013-05-09 64 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中永遠不會起作用。編譯模塊具有循環依賴性是很困難的,但是一個無望的原因。

有時候可能很煩人,但唯一真正的解決方案是找到一種方式來打破循環依賴。