Was ist der Unterschied zwischen Cabal und Stack?


104

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?


fpcomplete.com/blog/2015/06/announcing-first-public-beta-stack (kurz gesagt, es ersetzt cabal-installund 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.
Carsten

Der AFAIU-Stack ist praktisch, um schnell an einem vorhandenen Projekt zu arbeiten. Wenn Sie etwas von vorne anfangen, müssen Sie sicherlich Kabale verwenden.
mb14

@ mb14 Das ist nicht der Fall. Sie können Stack verwenden, um Projekte von Grund auf neu zu starten. In der Tat bieten Stapelvorlagen eine einfache Möglichkeit, dies zu tun.
Sibi

In diesem kurzen Artikel finden Sie einen guten Überblick: scs.stanford.edu/16wi-cs240h/labs/stack.html
michid

Antworten:


74

Ist Stack ein Ersatz für Cabal?

Ja und nein.

In welchen Fällen sollte ich Stack anstelle von Cabal verwenden? Was kann Stack, was Cabal nicht kann?

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 lädt sogar GHC für Sie herunter und bewahrt es an einem isolierten Ort auf.
  • Docker-Unterstützung (sehr praktisch für die Bereitstellung Ihrer Haskell-Anwendungen)
  • Reproduzierbares Haskell-Skript : Sie können die Version eines Pakets genau bestimmen und die Garantie erhalten, dass es immer problemlos ausgeführt wird. ( Cabal verfügt auch über eine Skriptfunktion , die vollständige Reproduzierbarkeit ist jedoch nicht ganz so einfach.)
  • Fähigkeit zu tun stack build --fast --file-watch . Dies wird automatisch neu erstellt, wenn Sie die vorhandenen lokalen Dateien ändern. Die Verwendung zusammen mit der --pedanticOption ist für mich ein Deal-Breaker.
  • Stack unterstützt das Erstellen von Projekten mit Vorlagen . Es unterstützt auch Ihre eigenen benutzerdefinierten Vorlagen.
  • Stapel hat eingebaut Hpack- Unterstützung. Es bietet eine alternative (IMO, eine bessere) Möglichkeit, Cabal-Dateien mit Yaml-Dateien zu schreiben, die in der Branche häufiger verwendet werden.
  • Intero hat eine reibungslose Erfahrung bei der Arbeit mit Stack .

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.


Hat sich seit der Veröffentlichung von Kabale 3 etwas geändert?
William Rusnack

1
@ WilliamRusnack Ja, da haben. In erster Linie beinhaltet der Standard-Cabal-Workflow jetzt die Vermeidung von Abhängigkeitskonflikten, obwohl sich die dazu verwendete Strategie deutlich von der von Stack unterscheidet. (@Sibi: Ich habe mir erlaubt, Ihre Antwort zu aktualisieren, damit sie besser widerspiegelt, wo die Dinge heutzutage stehen.)
Duplode

35

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 .cabalDatei 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 resolverBereich 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 .cabalDatei angegebenen Abhängigkeiten (oder möglicherweise die project.yamlDatei - 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 ).


11

Nach dem, was ich aus den FAQ entnehmen kann, scheint es, dass Stack die Cabal-Bibliothek verwendet, aber nicht die cabal.exeBinä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!)


Abgesehen davon cabalscheint ihr Quellcode auch zu verwenden docker. Obwohl ich noch nicht weiß, ob sie das benutzen.
Sibi

@Sibi Ja, es sieht so aus, als könnten Sie optional Dinge in Docker werfen, und es soll funktionieren. Ich habe es nicht viel weiter angeschaut ...
MathematicalOrchid
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.