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).
Was genau meinen Sie mit "in Ihre .yaml-Datei einfügen"? Kannst du ein Beispiel geben? – ErikR