2015-09-01 6 views
5

Ich bin ein Anfänger in Haskell so bin ich nur fragen, was einige gute Möglichkeiten, um zwischen verschiedenen verisons von ghc zu wechseln sind, so dass wir cabal installwhen the dependency of some Hackage requires an older version of base noch, anstatt Baum in Abhängigkeit läuft erschöpfend wie folgt gesucht:Haskell: Was sind einige gute Möglichkeiten, zwischen Ghc (für eine andere Basis) zu wechseln?

Resolving dependencies... 
cabal: Could not resolve dependencies: 
trying: bnfc-system-tests-0.1.0.0 (user goal) 
next goal: base (dependency of bnfc-system-tests-0.1.0.0) 
rejecting: base-4.8.0.0/installed-901... (conflict: bnfc-system-tests => 
base>=4.5 && <4.8) 
rejecting: base-4.8.0.0, 4.7.0.2, 4.7.0.1, 4.7.0.0, 4.6.0.1, 4.6.0.0, 4.5.1.0, 
4.5.0.0, 4.4.1.0, 4.4.0.0, 4.3.1.0, 4.3.0.0, 4.2.0.2, 4.2.0.1, 4.2.0.0, 
4.1.0.0, 4.0.0.0, 3.0.3.2, 3.0.3.1 (global constraint requires installed 
instance) 
Dependency tree exhaustively searched. 

Ich benutze einen Mac und ich installierte meine Haskell-Plattform (mit ghc-7.10.1.1) mit brühen (brew install ghc & cabal-install). Also ging ich eine ältere Version von Haskell-Plattform greifen here, fügte einen Alias ​​für die ältere Version von ghc in meinem .zshenv

ghc-78 --version 
The Glorious Glasgow Haskell Compilation System, version 7.8.4 

und machte eine neue Konfigurationsdatei in ~/.cabal mit

-- compiler: ghc-78 

Aber nach dass, wenn ich

cabal --config-file="./config78" install --only-dependencies --enable-tests 

im Sandbox-Verzeichnis lief, habe ich noch in das Abhängigkeitsproblem bekam darauf hinweist, dass ich noch ghc 7,10 wurde mit. (So ​​danach änderte ich die Linie zurück zu Compiler: ghc und hinzugefügt ghc-Standort.

-- ghc-location: the/new/directory/ghc 

programmLokationen und ich war immer noch die gleiche Sache immer)

Was habe ich falsch gemacht und Was sind einige gute Möglichkeiten, zwischen verschiedenen Versionen von GhC zu wechseln? (Zum Beispiel in Node.js kann ich n verwenden, eine Versionskontrolle Manager)


--update:

Selbst nachdem ich die Linie

unkommentiert haben
compiler: ghc-78 

cabal --config-file="./config78" install --only-dependencies --enable-tests noch geben würde, mir der Abhängigkeitsfehler (auch wenn ich stattdessen --sandbox-config-file verwendet habe). cabal sandbox hc-pkg list base würde zeigen, basen 4.8.0.0, auch wenn ich Sandbox mit der Konfigurationsdatei init:

cabal --config-file="./config78" sandbox init 

jedoch

cabal install -w ghc-7.8.4 

solange ghc-7.8.4 arbeitet in Weg ist, wie suggested by Daniel in the comment .

+2

GHC selbst bietet bereits versionierte Binärdateien; 'ghc-7.8.4' und' ghc-7.10.1' (oder ähnlich) sollten bereits auf Ihrem Weg sein. Außerdem können Sie eine Version in der 'cabal'-Befehlszeile ziemlich einfach mit' -w' angeben, wie in 'cabal install -w ghc-7.8.4' - keine Notwendigkeit, eine spezielle separate Konfigurationsdatei zu erstellen. –

+0

@DanielWagner tolle Tipps! Vielen Dank! –

Antwort

4

würde ich mit stack dafür empfehlen:

von Wenn Sie einen Resolver auswählen, wählen Sie auch eine GHC-Version aus. Ihr Code wird also mit demselben GHC erstellt, den auch Stackage verwendet. Verwenden Sie einen Resolver wie lts-2.17 für GHC 7.8.4 oder lts-3.3 für GHC 7.10.2 usw.

Auch ich schlage vor, mit:

system-ghc: false 

in Ihrer stack.yaml Datei, so dass stack immer eine eigene Werkzeug-Kette verwendet.

+0

Kühl. Habe das neulich auf [HN] (https://news.ycombinator.com/item?id=9687274) gesehen. aber hatte nicht die Zeit, es zu überprüfen. Lesen Sie es einfach durch. Tolles Werkzeug. –

4

Zeilen, die mit -- beginnen, werden von Cabals Konfigurationsdateiparser als Kommentare behandelt. So sollten Sie

ändern

-- compiler: ghc-78

zu

compiler: ghc-78

+0

Danke! Irgendwie habe ich den Kommentar in der 6. Zeile verpasst; Und es dauerte lange genug, bis ich begriff, dass es Yam! Aber selbst nach dem Auskommentieren der Zeile zeigt es immer noch, dass ich 'base-4.8.0.0 'verwende. –

+0

Kann es sein, dass ghc.7.8 auch Base 4.8 benutzt? Wie kann ich das überprüfen? Vielen Dank! –

+1

@ArchWilhes Sie können die Version von 'base' mit' ghc-pkg' überprüfen. Zum Beispiel sagt 'ghc-pkg-7.8.4 list base' Ihnen, welche Versionen von' base' in der Paketdatenbank von GHC 7.8.4 installiert sind. Wenn Sie sich in einer Cabal-Sandbox befinden und wissen möchten, welche Pakete in der Sandbox installiert sind, sollten Sie 'cabal sandbox hc-pkg' anstelle von' ghc-pkg' verwenden (welches die von Ihnen gewünschte Version von 'ghc-pkg' auswählt) für während des 'configure' Schrittes und zeigt es auf die Paketdatenbank der Sandbox. –

4

Zur Vervollständigung, lassen Sie mich eine weitere Option hinzufügen hier: Nix. Sie können einfach verschiedene Versionen von ghc gleichzeitig mit Nix installieren und warten. auf eine andere ghc Version wechseln alles, was Sie tun müssen, ist:

nix-shell -p haskell.compiler.ghc7102 

Oder wenn Sie eine 7.8.4 Version wollen, dann:

nix-shell -p haskell.compiler.ghc784 

Bei ghc 7.10.2 oder der anderen Version isn‘ Wenn sie installiert ist, wird Nix sie automatisch herunterladen und installieren. (Wenn Sie das nächste Mal diesen Befehl eingeben, wird die installierte Komponente offensichtlich erneut verwendet.) Sobald Sie sich in der nix-shell-Umgebung befinden, können Sie zu Ihrem Paketverzeichnis navigieren und dort Ihr haskell-Paket erstellen. Beachten Sie, dass Sie Ihr haskell-Paket entweder mit dem üblichen cabal-Befehl dort oder nix-build erstellen können. Weitere Informationen über Nix und Haskell erhalten Sie unter in this manual.

+0

Das ist sehr informativ! Vielen Dank –

Verwandte Themen