2015-04-24 11 views
6

Różne języki programowania używają różnych systemów pakowania.Chleb zależności w kabale. To naprawdę piekło.

W swoim zróżnicowanym podejściu, Java's Maven wygląda jak najlepiej dla mnie, ponieważ utrzymuje różne wersje plików jar w osobnych wersjach folderów, a zatem nie ma mowy, aby skończyć w konfliktowych wersjach biblioteki.

Następnie przychodzi python. Python's pip umieszcza swoje pakiety w /usr/local/lib/python/dist-packages/site-packages. Gdy występuje konflikt wersji, można użyć jego virtualenv i żyć z nim.

Nodejs obsługuje instalowanie pakietów zarówno w folderach lokalnych, jak i folderach globalnych. Do tej pory, nigdy nie miałem konfliktu zależności w bibliotekach globalnych.

Potem zafascynował mnie styl haskell i zacząłem używać cabal. Najpierw instalowałem moje biblioteki wewnątrz /home/user1/.cabal. Kiedy system paczek się zepsuł, jeden z przyjaciół zaproponował mi usunięcie dwóch folderów - /home/user1/.cabal && /home/user1/.ghc. Teraz, moje pierwsze zamieszanie powstało, dlaczego pliki biblioteki cabal siedzą w dwóch folderach .cabal && .ghc. Oczyściłem foldery biblioteki, ~/.ghc and ~/.cabal i zrobiłem cabal install ze źródła pakietu dla cabal-db-0.1.12. Teraz pojawił się nowy błąd i byłem zaskoczony, ponieważ zdezynfekowałem wszystkie lokalne repozytoria. Wystąpił błąd,

Configuring Cabal-1.22.2.0... 
Building Cabal-1.22.2.0... 
Installed Cabal-1.22.2.0 
cabal: Error: some packages failed to install: 
ansi-terminal-0.6.2.1 failed during the configure step. The exception was: 
user error (The package 'ansi-terminal' requires Cabal library version -any && 
>=1.6 but no suitable version is installed.) 

Potem próbowałem najbezpieczniejszym - sandbox dla cabal-db. Zadziałało. Potem powtórzyłem sandboxing dla innego pacakge, ghc-pkg-autofix. Zrobiłem,

cd ghc-pkg-autofix-0.2.0.1 
cabal sandbox init 
cabal install 

I do piaskownicy, gdzie nie ma absolutnie żadnych zależności zewnętrzne, tam znowu są błędy,

cabal: Could not resolve dependencies: 
trying: ghc-pkg-autofix-0.2.0.1 (user goal) 
trying: Cabal-1.22.2.0 (dependency of ghc-pkg-autofix-0.2.0.1) 
next goal: process (dependency of ghc-pkg-autofix-0.2.0.1) 
rejecting: process-1.2.0.0/installed-06c..., 1.2.3.0, 1.2.2.0, 1.2.1.0, 
1.2.0.0, 1.1.0.2, 1.1.0.1, 1.1.0.0 (conflict: ghc-pkg-autofix => process>=1.0 
&& <1.1) 
rejecting: process-1.0.1.5, 1.0.1.4, 1.0.1.3, 1.0.1.2, 1.0.1.1, 1.0.0.0 
(conflict: Cabal => process>=1.1.0.1 && <1.3) 
Dependency tree exhaustively searched. 

Note: when using a sandbox, all packages are required to have consistent 
dependencies. Try reinstalling/unregistering the offending packages or 
recreating the sandbox. 

robię coś źle (lub) tego rodzaju konfliktów zależność są dość powszechne w kabała? Rozumiem, że zarządzanie zależnościami w innych językach jest o wiele prostsze.

Uwaga: Używam cabal-install version 1.22.0.0 & & The Glorious Glasgow Haskell Compilation System, version 7.8.4

+0

Nie jest to częste - ale bardzo często dla początkujących. Rzeczywiście, najprostszym sposobem dla początkujących jest ustawienie IMHO w czystym środowisku i korzystanie z obszarów izolowanych. Jest [ładny tutorial, jak to zrobić tutaj] (http://www.stackage.org/install) (nie musisz używać części stosu, jeśli nie chcesz - jeśli masz GHC 7.10 .1 faktycznie nie możesz AFAIK) - btw: użyłeś Celala-1.22 celowo (np. Z GHC 7.10.1?), Ponieważ nie korzystałbym z platyny Haskella) – Carsten

+0

btw: ciekawy - jak maven radzi sobie z sytuacją Pakiet X zależy od A-Vers1 i Y na a-Vers2 (niekompatybilny) i chcesz używać zarówno X, jak i Y? – Carsten

+0

Wewnątrz repozytorium 'M2_HOME', maven utworzy dwa foldery, takie jak' A/1.0.0/* 'i' A/2.0.0/* '. Ponieważ globalne repozytorium używa oddzielnych folderów opartych na wersjach, różne wersje tego samego "archetypu/słoika" mogą znajdować się wewnątrz twojego systemu w jednym miejscu. –

Odpowiedz

5

„I do piaskownicy, gdzie nie ma absolutnie żadnych zależności zewnętrzne” nie jest to prawdą. Piaskownica nadal ma zależności od globalnej bazy pakietów. Takie rzeczy jak Cabal, GHC, proces są zwykle instalowane w globalnej bazie danych pakietów. Tutaj chcesz zainstalować ghc-pkg-autofix, który wymaga procesu 1.0, ale masz nowszą wersję procesu już zainstalowanego. Czy na pewno potrzebujesz ghc-pkg-autofix, wydaje się być dość stary.

+2

Nie tylko OP ma nowszą wersję procesu instalacji, ale ghc-pkg-autofix również zależy od Cabala, a wersja OP Caba wymaga nowszej wersji procesu niż ta ghc-pkg-autofix (podobno) wymaga, więc jest to prawdziwy problem zależności od diamentów. –