2016-08-08 69 views
6

Ich habe vor kurzem begonnen, Stack für Haskell zu verwenden, wenn externe Abhängigkeiten für Ihr Projekt angegeben werden. Manchmal platzieren Sie es in der CABAL-Datei, während Sie es manchmal in der YAML-Datei platzieren.stack.yaml Datei & .cabal Datei Unterschiede?

Bin ich der Meinung, dass wenn Sie es in die Cabal-Datei einfügen, es nur im Stapelspeicher für Ihre Pakete aussieht. Wenn Sie es jedoch in Ihre YAML-Datei einfügen, sucht es auch im Hackage-Server, wenn es in keinem der Snapshots gefunden werden kann.

+0

Was genau meinen Sie mit "in Ihre .yaml-Datei einfügen"? Kannst du ein Beispiel geben? – ErikR

Antwort

12

Alle Abhängigkeiten für Ihr Projekt gehen in die Datei .cabal. Sie haben jedoch Recht, dass Sie manchmal auch Pakete in der Datei stack.yaml auflisten, was verständlicherweise verwirrend sein kann. Warum das?

Nun, die .cabal Datei drückt immer die Abhängigkeiten von Paketen, aber die stack.yaml Datei konfiguriert effektiv wo diese Pakete von kommen. Wenn Sie stack verwenden, stammen Pakete normalerweise von Stackage basierend auf dem Resolver, den Sie in der Datei stack.yaml angeben. Stackage enthält jedoch nicht alle Pakete in Hackage und ist nicht dazu gedacht, wenn Sie Pakete benötigen, die außerhalb von Stackage liegen, müssen Sie sie in der Datei stack.yaml angeben.

Warum ist das? Nun, der Resolver koppelt zwei wichtige Informationen automatisch zusammen: Paketnamen und Paketversionen. Stackage-Resolver bieten eine (schwache) Garantie, dass alle Pakete in einem einzelnen Resolver zusammenarbeiten. Wenn also ein Paket von einem Resolver stammt, müssen Sie nicht manuell die gewünschte Version auswählen. Stattdessen wird Stackage für Sie entscheiden.

Wenn Sie Pakete aus Hackage ziehen, haben Sie diesen Luxus nicht, also müssen Sie die Pakete und ihre Versionen mit extra-deps angeben. Zum Beispiel könnten Sie so etwas wie diese:

extra-deps: 
- crypto-pubkey-openssh-0.2.7 
- data-bword-0.1 
- data-dword-0.3 

Dieser Eintrag bestimmt speziell, welche Versionen von denen Pakete sollten von Hackage statt Stackage gezogen werden.


beim Erstellen von Anwendungen, könnte dies ein wenig redundant Sie scheinen Version Einschränkungen in der .cabal Datei angeben können, auch, also warum duplizieren sie in der stack.yaml-Datei? Beim Erstellen einer Bibliothek ist die Unterscheidung jedoch ein wenig bedeutender: Die Datei .cabal drückt die tatsächlichen Versionsbeschränkungen Ihrer Bibliothek aus (falls vorhanden), aber die Datei stack.yaml gibt genau an, welche Versionen bei der lokalen Entwicklung tatsächlich installiert werden.

In diesem Sinne dient die stack.yaml Datei einen ähnlichen Zweck wie die Gemfile.lock oder npm-shrinkwrap.json Dateien von anderem Paket-Manager, obwohl die Aufgaben nicht annähernd so eindeutig mit stack (teilweise aus historischen Gründen um, wie Haskell Paketsystem sind funktioniert und einige der Probleme, die es in der Vergangenheit hatte).