2013-05-09 2 views
2

я получил следующий вопрос:управление два библиотеками с интригой, которые зависят друг от друга

У меня есть две библиотек Haskell, которые зависят друг от друга, и обе библиотеки управляется заговорщиками. Соответствующие Cabal файлы выглядеть следующим образом:

Library 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: <...> 

Library 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: <...> 

Установка одной из библиотек (здесь библиотека 2) с cabal install работ:

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? Если вы это сделали, момент, когда Кабаль пытается установить Lib1, он сломает Lib2 (что зависит от Lib1). Попробуйте отменить регистрацию обоих пакетов ('ghc-pkg unregister') и повторить попытку - я подозреваю, что это даст более четкий набор ошибок. – isturdy

+6

Круговые зависимости приведут только к неприятностям, если вы даже можете заставить их работать вообще. Разрыв цикла, перемещение некоторых вещей из одного пакета в другой, извлечение общего кода в третий пакет или объединение пакетов в один. – hammar

ответ

5

Как уже говорилось, круговые зависимости никогда не будут работать в Cabal. Трудно собрать модули с круговыми зависимостями, но пакеты - это безнадежная причина.

Иногда это может быть неприятно сложно, но единственным реальным решением является найти способ как-то нарушить круговую зависимость.

Смежные вопросы