Im Folgenden werde ich die beiden Werkzeuge, die verglichen werden, als Kabaleninstallation und Stapelung bezeichnen . Insbesondere werde ich die Kabaleninstallation verwenden , um Verwechslungen mit den Kabalen zu vermeiden Bibliothek es sich um eine gemeinsame Infrastruktur handelt, die von beiden Tools verwendet wird.
Im Großen und Ganzen können wir sagen, dass Cabal-Install und Stack Frontends für Cabal sind . Beide Tools ermöglichen das Erstellen von Haskell-Projekten, deren Abhängigkeiten innerhalb der Grenzen eines einzelnen Systems miteinander in Konflikt stehen können. Der Hauptunterschied zwischen ihnen liegt darin, wie sie dieses Ziel erreichen:
Standardmäßig Installation der , wenn Sie aufgefordert werden, ein Projekt zu erstellen, die in der .cabal
Datei angegebenen Abhängigkeiten und verwendet einen Abhängigkeitslöser, um eine Reihe von Paketen und Paketversionen zu ermitteln, die diesem entsprechen. Dieses Set stammt aus der Hackage Kabaleninstallation, dh als Ganzes - alle Pakete und alle Versionen, Vergangenheit und Gegenwart. Sobald ein realisierbarer Build-Plan gefunden wurde, wird die ausgewählte Version der Abhängigkeiten installiert und in einer Datenbank irgendwo in indiziert,~/.cabal
. Versionskonflikte zwischen Abhängigkeiten werden vermieden, indem die installierten Pakete nach ihren Versionen (sowie anderen relevanten Konfigurationsoptionen) indiziert werden, sodass verschiedene Projekte die benötigten Abhängigkeitsversionen abrufen können, ohne sich gegenseitig auf die Zehen zu treten. Diese Anordnung ist was dieDokumentation zur Installation von Kabalen bedeutet "lokale Builds im Nix-Stil" .
Wenn Sie aufgefordert werden, ein Projekt zu erstellen, wird sich Stack nicht mit Hackage befassen, sondern mit dem resolver
Bereich stack.yaml
. Im Standardworkflow gibt dieses Feld einen Stapel- Snapshot an , bei dem es sich um eine Teilmenge von Hackage-Paketen mit festen Versionen handelt, von denen bekannt ist, dass sie miteinander kompatibel sind. Der Stapel versucht dann, die in der .cabal
Datei angegebenen Abhängigkeiten (oder möglicherweise die project.yaml
Datei - anderes Format, gleiche Rolle) nur mit dem zu erfüllen, was der Snapshot bereitstellt. Von jedem Snapshot installierte Pakete werden in separaten Datenbanken registriert, die sich nicht gegenseitig stören.
Wir könnten sagen, dass der Stack- Ansatz eine gewisse Setup-Flexibilität gegen Unkompliziertheit eintauscht, wenn es darum geht, eine Build-Konfiguration anzugeben. Insbesondere wenn Sie wissen, dass Ihr Projekt beispielsweise den LTS 15.3-Snapshot verwendet, können Sie auf die Seite " Stapel" gehen und auf einen Blick erkennen, welche Versionen eines Abhängigkeitsstapels möglicherweise aus dem Stapel stammen. Beide Tools bieten jedoch Funktionen, die über die grundlegenden Workflows hinausgehen, sodass jeder im Großen und Ganzen alles kann, was der andere tut (wenn auch möglicherweise auf weniger bequeme Weise). Zum Beispiel gibt es Möglichkeiten, exakte Versionen einer bekannten guten Build-Konfiguration einzufrieren und Abhängigkeiten mit einem alten Hackage - Status mit cabal-install zu lösenund es ist möglich, Nicht-Stackage-Abhängigkeiten zu verlangen oder Snapshot-Paketversionen zu überschreiben, während Stack verwendet wird .
Ein weiterer Unterschied zwischen Cabal-Installation und Stack, der groß genug ist, um in dieser Übersicht erwähnt zu werden, besteht darin, dass Stack eine vollständige Build-Umgebung mit Funktionen wie automatischem GHC-Installationsmanagement und Docker-Integration bereitstellen soll . Im Gegensatz dazu soll die Installation von cabal orthogonal zu anderen Teilen des Ökosystems sein und versucht daher nicht, diese Art von Funktion bereitzustellen (insbesondere müssen GHC-Versionen separat installiert und verwaltet werden, sei es über die Linux-Distribution Pakete, den Haskell Platform Core in Windows oder das ghcup-Tool ).
cabal-install
und verwendet Stackage so oft wie möglich - es könnte irgendwann eine gewisse Rückintegration in die Kabaleninstallation geben, und ich denke Die Community ist sich nicht sicher, ob dies eine gute Sache ist oder nicht, da dies die Community spalten könnte.