Gestern habe ich von einem neuen Haskell-Tool namens Stack erfahren . Auf den ersten Blick sieht es so aus, als ob es den gleichen Job wie Cabal macht. Was ist der Unterschied zwischen ihnen? Ist Stack ein Ersatz für Cabal? In welchen Fällen sollte ich Stack anstelle von Cabal verwenden? Was kann Stack, was Cabal nicht kann?
haskell
cabal
haskell-stack
ZhekaKozlov
quelle
quelle
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.Antworten:
Ja und nein.
Stapel verwendet die kuratierte stackage Pakete von Standard . Unter diesen Umständen bauen sich Abhängigkeiten bekanntermaßen zusammen, um Versionskonfliktprobleme zu vermeiden (die früher in der Haskell-Erfahrung als "Kabalenhölle" bekannt waren). Neuere Versionen von Cabal verfügen auch über Maßnahmen zur Verhinderung von Konflikten. Das Einrichten einer reproduzierbaren Build-Konfiguration, in der Sie genau wissen, was aus den Repositorys abgerufen wird, ist mit Stack jedoch einfacher. Beachten Sie, dass auch die Verwendung von Nicht-Stackage-Paketen vorgesehen ist. Sie können also auch dann loslegen, wenn im Stackage-Snapshot kein Paket vorhanden ist.
Persönlich mag ich Stack und würde jedem Haskell-Entwickler empfehlen, es zu verwenden. Ihre Entwicklung ist schnell . Und es hat eine viel bessere UX. Und es gibt Dinge, die Stack tut, die Cabal noch nicht bietet:
stack build --fast --file-watch
. Dies wird automatisch neu erstellt, wenn Sie die vorhandenen lokalen Dateien ändern. Die Verwendung zusammen mit der--pedantic
Option ist für mich ein Deal-Breaker.Es gibt einen schönen Blog-Beitrag, der den Unterschied erklärt: Warum ist Stack nicht Cabal? Während sich Cabal in den vergangenen Jahren seit diesem Posten weiterentwickelt hat, um einige der dort diskutierten Probleme zu lösen, bleibt die Diskussion der Designziele und der Philosophie hinter Stack relevant.
quelle
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
Bereichstack.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 dieproject.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 ).
quelle
Nach dem, was ich aus den FAQ entnehmen kann, scheint es, dass Stack die Cabal-Bibliothek verwendet, aber nicht die
cabal.exe
Binärdatei (genauer gesagt Cabal-Install). Es sieht so aus, als ob das Ziel des Projekts das automatische Sandboxing und die Vermeidung der Abhängigkeitshölle ist.Mit anderen Worten, es wird dieselbe Cabal-Paketstruktur verwendet, es bietet lediglich ein anderes Front-End für die Verwaltung dieses Materials. (Meiner Ansicht nach!)
quelle
cabal
scheint ihr Quellcode auch zu verwendendocker
. Obwohl ich noch nicht weiß, ob sie das benutzen.