2014-05-07 7 views
25

Niedawno natknąłem się na kwestię "kabalnego piekła", którą udało mi się rozwiązać tylko ręcznie instalując transformers-compat z flagą -f transformers3 w mojej kabalowej piaskownicy przed uruchomieniem cabal install dla mojego projektu.Czy istnieje sposób definiowania flag dla zależności cabal?

Czy jest jakiś sposób, aby wskazać w pliku mojej aplikacji .cabal, że zależę od biblioteki, tak że jest zbudowany z określoną flagą kompilacji?

+2

Wygląda na to, że nie jest to możliwe. 'buiildDepends' jest zdefiniowany jako' [Dependency] ', gdzie' data Dependency = Dependency NazwaPakietu VersionRange'. Możesz użyć 'cabal install --constraint =" transformers-compat + transformers3 "'. –

+0

W skrócie wygląda na to, że transformatory-compat mają być podkładkami używanymi do starych projektów ze starymi zależnościami. Czy możesz zaktualizować pakiet do nowej wersji transformatorów? –

+1

Patrząc na plik 'transformers-compat.cabal', uważam, że solver powinien być w stanie znaleźć poprawne przypisanie flagi, jeśli odpowiednio ograniczysz zależność od' transformatorów '. Na przykład. 'build-depends: transformers> = 0.3 && <0.4' powinno zmusić solver do wybrania' transformers-compat + transformers3'. Jeśli to nie zadziała, może to być błąd w solwerze. –

Odpowiedz

7

Współczesnym sposobem na to jest użycie Stack.Edytować swoich stack.yaml zawierać

flags: 
    transformers-compat: 
    transformers3: true 

Zobacz także sekcję flags.

+0

, który zapisał dzień – nicolas

-1

Istnieje kilka sposobów na ograniczenie wersji do instalacji.

  1. Dodaj dolne i górne granice na pakiet wersji w pliku cabal jak Mikhail wspomniano powyżej, example of such a file here

  2. Dodatkowo można zastąpić ustawienia w pliku .cabal z flagą cabal install --constraint="bar-2.1"

Aby usunąć określoną wersję pakietu:

  • W piaskownicy można wyrejestrować wersję z cabal sandbox hc-pkg unregister bar-2.1
  • Globalny wyrejestrowywania można zrobić z tego polecenia poza piaskownicą ghc-pkg unregister bar-2.1
13

[Skopiowane z sekcji komentarzy.]

Wygląda na to nie można określić takiej zależności za pomocą pola build-depends w pliku .cabal. buildDepends is defined as [Dependency], gdzie data Dependency = Dependency PackageName VersionRange. Możesz jednak użyć cabal install --constraint="transformers-compat +transformers3".

Patrząc na plik transformers-compat.cabal, myślę, że solver powinien być w stanie znaleźć prawidłowe przypisanie flagi, jeśli odpowiednio ograniczysz zależność od transformers. Na przykład. build-depends: transformers >= 0.3 && < 0.4 powinien wymusić na solver, aby wybrał transformers-compat +transformers3. Jeśli to nie zadziała, może to być błąd w solwerze.

Poza tym: wywoływanie jakichkolwiek problemów technicznych z Cabal "Cabal hell" nie jest zbyt pouczające. Byłoby ci łatwiej pomóc, gdybyś opisał otrzymany komunikat o błędzie.

7

Długo szukałem rozwiązania tego problemu. Właśnie znalazłem jeden! Musisz zmodyfikować globalny plik konfiguracyjny cabal w ~/.cabal/config. Dodaj linię podobnego do początkowej części pliku:

ograniczenia: hmatrix + openblas

Umożliwia flagę openblas dla pakietu hmatrix. Będzie używany automatycznie przy następnym zainstalowaniu pakietu. Jeśli istnieje sposób na ustawienie lokalnej flagi dla piaskownicy, nie mógłbym jej znaleźć.

+3

Najnowsza wersja Cabala wydaje się używać słowa kluczowego "ograniczenia" (uwaga w liczbie mnogiej). –