Ich tauche in Scala ein und habe sbt bemerkt. Ich war sehr zufrieden mit Gradle in Java / Groovy-Projekten und ich weiß, dass es ein Scala-Plugin für Gradle gibt.
Was könnten gute Gründe sein, sbt in einem Scala-Projekt Gradle vorzuziehen?
SBT ist in gewisser Weise wie ein Vim: Wenn Sie es groken, werden Sie sich freuen. Übrigens gibt es auch Maven und Lein (wurde für Clojure entwickelt, funktioniert aber auch mit Scala).
Om-Nom-Nom
18
Fühlen Sie sich nicht gezwungen, zu SBT zu wechseln. Einige bekannte Mitglieder der Scala-Community verwenden Gradle. Verwenden Sie stattdessen SBT als Experiment, da Sie wissen, dass Sie stattdessen nur Gradle verwenden können.
Daniel C. Sobral
6
Vielen Dank an alle ... Nachdem ich Ihre Erkenntnisse gelesen habe, bleibe ich bei Gradle. Es scheint mir, dass dort die meisten Build-Tool-Bemühungen für den JVM-Bereich stattfinden werden, wenn wir Maven zurücklassen.
Hans Westerbeek
10
Es ist ärgerlich, dass diese Frage hier als "meinungsbasiert" markiert wird, wahrscheinlich von Leuten, die nicht die ganze Zeit im JVM-Raum arbeiten (und daher kein Versehen haben). Die folgenden Antworten sind sachlich und ohne Heilig-Krieg-Ismen.
Hans Westerbeek
4
Nein, diese Antworten sind in erster Linie Aussagen über überprüfbare Tatsachen, keine Meinungen. Diese Frage könnte zwar nicht hilfreiche Antworten finden, hat dies jedoch nicht getan. Es sollte als nützliche Beschreibung der tatsächlichen Unterschiede zwischen den Werkzeugen offen bleiben.
Erickson
Antworten:
61
Beachten Sie, dass ein wesentlicher Unterschied zwischen SBT und Gradle das Abhängigkeitsmanagement ist :
SBT : Ivy , mit einer Revision, die als feste (z. B. 1.5.2) oder als neueste (oder dynamische) Revision angegeben werden kann.
Siehe " Ivy Dependency ".
Dies bedeutet, dass die Unterstützung des "-SNAPSHOT" -Mechanismus problematisch sein kann, obwohl Mark Harrah Details in diesem Thread beschreibt :
Es ist wahr, dass der Cache verwirrt werden kann, aber es ist nicht wahr, dass Ivy das Auflösen von Snapshots nicht versteht. Eugene erklärte diesen Punkt in einem anderen Thread, vielleicht auf der Admin-Liste. Es gibt ein Problem mit der automatischen Aktualisierung von sbt, das in Version 0.12 behoben wurde.
Was Ivy meines Wissens nicht unterstützt, ist die Veröffentlichung von Schnappschüssen in der Art, wie Maven es tut. Ich glaube, ich habe dies an anderer Stelle angegeben, aber wenn jemand die Situation verbessern möchte, ist es meiner Meinung nach am besten, mit dem Gradle-Team zusammenzuarbeiten, um den Code für das Abhängigkeitsmanagement wiederzuverwenden.
Nur um Sie wissen zu lassen, waren Probleme mit Ivy- und Maven-Snapshot-Abhängigkeiten einer der Gründe, warum Gradle Ivy schließlich durch seinen eigenen Abhängigkeitsverwaltungscode ersetzte. Es war eine große Aufgabe, brachte uns aber viel Güte.
In diesem Tweet wird erwähnt, dass sich die gesamte Situation in Zukunft weiterentwickeln könnte:
Mark sagte in der Vergangenheit, dass er daran interessiert sei, Gradle anstelle von Ivy für SBT zu verwenden.
Die größte Unannehmlichkeit, die ich je erlebt habe, ist, dass Sie nicht angeben konnten, dass die Regel nicht jedes Mal neu kompiliert werden soll, wenn sie erwähnt wird. Integrierte Regeln für Java und Scala verfügen über diese Funktionalität, sind jedoch nicht zum Schreiben benutzerdefinierter Regeln verfügbar. Jedes Mal, wenn Sie eine Programmdatei oder Dokumentation generieren und selbst wenn Sie eine JAR-Datei generieren, wird Ihre Aufgabe bei jedem Aufruf ausgeführt, unabhängig davon, ob Änderungen an den Quellen tatsächlich vorgenommen wurden. Sogar machen ist klug genug, aber nicht sbt
Ayvango
1
@ayvango Es ist heutzutage nicht der Fall sbt. Es gibt viele Plugins, die diese Funktionalität nutzen, wie das Android-SDK-Plugin
dant3
Wissen Sie, welche API für diese Funktionalität verwendet wird?
Ayvango
Also fehlt Efeu im Vergleich zu Maven & Gradle? Das ist seltsam
Tribbloid
53
Für mich sind die Hauptmerkmale von SBT:
Schnelle Kompilierung (schneller als fsc).
Kontinuierliches Kompilieren / Testen: Der Befehl ~testkompiliert und testet Ihr Projekt jedes Mal neu, wenn Sie eine Änderung speichern.
Cross-Compilation und Cross-Publishing über mehrere Scala-Versionen hinweg.
Automatisches Abrufen von Abhängigkeiten mit der richtigen Kompatibilität der Scala-Version.
Die Nachteile sind:
Eine Hieroglyphensyntax, die neue Benutzer eher entmutigt (insbesondere wenn sie aus Java stammen).
Keine einfache Möglichkeit, eine "Aufgabe" zu definieren: Wenn Sie eine spezielle Erstellungsprozedur benötigen, müssen Sie entweder ein Plugin finden oder selbst ein Plugin schreiben.
Stimmt es, dass die Cross-Compilation / Publishing-Funktion aufgrund der Probleme, die Scala mit der Abwärts-Binär-Inkompatibilität hatte, erforderlich ist / war?
Hans Westerbeek
1
Ja. Und diese Probleme können erneut auftreten, wenn Sie zu Scala 2.10 wechseln.
Paradigmatischer
1
Ich möchte noch zwei weitere Unterschiede hinzufügen: * In SBT ist es einfacher, Abhängigkeiten selbst zu verwalten, IMO. * Der SBT-Testläufer scheint schneller zu sein. Ich vermute, dass es hier um eine listige Parallelität geht, aber ich vermute. SBT scheint ein leistungsfähigeres, aber weniger ausgereiftes Produkt zu sein.
Rick-777
25
+1 für den Nachteil der Hieroglyphensyntax. Das ist mein größter Kritikpunkt an SBT. Überlastung des Bedieners führt immer zu Missbrauch: - /
Ron Dahlgren
7
Die kryptische SBT-Syntax bringt das Schlimmste in Scala heraus. Gradle basiert auf einem durchdachten Domain-Modell und einer einfachen Syntax.
Nemoo
40
sbt ist ein Scala DSL und dafür ist Scala ein erstklassiger Bürger, daher scheint es im Prinzip gut zu passen.
Sbt leidet jedoch unter größeren inkompatiblen Änderungen zwischen den Versionen, was es schwierig macht, das richtige funktionierende Plugin für eine Aufgabe zu finden und zum Laufen zu bringen.
Ich persönlich habe sbt aufgegeben, da es mehr Probleme verursachte als es löste. Ich bin tatsächlich zu Gradle gewechselt.
Soweit ich weiß, gab es nur eine sehr große Änderung: als sbt von 0.7.x auf 0.1.x wechselte
om-nom-nom
1
Wenn Sie ein Plugin für sbt 0.11.2 verwenden und dann zu sbt 0.12 wechseln, müssen Sie warten, bis der Plugin-Autor eine neue Version kompiliert hat, oder es selbst tun. idea-sbt ist ein Beispiel.
fmpwizard
4
@fmpwizard Die Zeile sbt 0.12 ist noch nicht freigegeben ... Stoppen Sie die Verbreitung von FUD.
Paradigmatisch
3
Es ist nicht das sbt ist unmöglich zu benutzen, unser Team benutzt es. Aber mein Kommentar war, diese Antwort zu unterstützen, die lautete: "... Aber sbt leidet unter großen inkompatiblen Änderungen zwischen den Versionen, was es schwierig macht, das richtige funktionierende Plugin für eine Aufgabe zu finden und es zum Laufen zu bringen ..." Wie Sie bemerken Ich kann das scct-Plugin nicht einfach verwenden, ich musste es ändern (ja, kleine Änderung, aber dann musste ich es irgendwo veröffentlichen, damit mein gesamtes Team darauf zugreifen konnte). Ein Schmerz ohne guten Grund.
fmpwizard
3
Können Sie mit gradle eine Cross-Kompilierung für verschiedene Scala-Versionen durchführen?
Machisuji
4
Ich bin ziemlich neu in Gradle und sehr neu in sbt - was ich bisher an sbt wirklich mag, ist die interaktive Konsole. Ich kann Befehle wie "inspizieren" verwenden, um eine bessere Vorstellung davon zu bekommen, was los ist. AFAIK gradle bietet so etwas nicht atm.
Sbt und gradle basieren beide auf statisch typisierten Sprachen ... aber sbt hat nur wenige Vorteile:
Bessere Plugin-Unterstützung, insbesondere Autoplugins
Aufgabenerstellung und Abhängigkeitsmanagement zwischen Aufgaben
sbt eignet sich speziell für Scala-Projekte in dem Sinne, dass es inkrementelle Builds unterstützt und der größte Teil des sbt selbst in Scala und die Definitionen von sbt-Builds in Scala geschrieben sind
sbt bietet interaktive Shell-Unterstützung mit vielen nützlichen integrierten Aufgaben
Der Standardlebenszyklus von sbt ist sehr nützlich und kann Anfänger mit weniger Aufwand starten
Gradle basiert auf Groovy, einer nicht statisch typisierten Sprache.
Vistritium
Gradle verwaltet Abhängigkeiten zwischen Aufgaben. Es ist so einfach wie möglich, eine Aufgabe zu erstellen. Ich habe keine Ahnung, wie es einfacher sein kann, ein Plugin zu schreiben, als für Gradle, das Groovy-, Java-, Gradle-Plugins und möglicherweise mehr benötigt.
Antworten:
Beachten Sie, dass ein wesentlicher Unterschied zwischen SBT und Gradle das Abhängigkeitsmanagement ist :
Siehe " Ivy Dependency ".
Dies bedeutet, dass die Unterstützung des "-SNAPSHOT" -Mechanismus problematisch sein kann, obwohl Mark Harrah Details in diesem Thread beschreibt :
In diesem Tweet wird erwähnt, dass sich die gesamte Situation in Zukunft weiterentwickeln könnte:
(beide Werkzeuge können voneinander lernen )
quelle
Für mich sind die Hauptmerkmale von SBT:
fsc
).~test
kompiliert und testet Ihr Projekt jedes Mal neu, wenn Sie eine Änderung speichern.Die Nachteile sind:
quelle
sbt ist ein Scala DSL und dafür ist Scala ein erstklassiger Bürger, daher scheint es im Prinzip gut zu passen.
Sbt leidet jedoch unter größeren inkompatiblen Änderungen zwischen den Versionen, was es schwierig macht, das richtige funktionierende Plugin für eine Aufgabe zu finden und zum Laufen zu bringen.
Ich persönlich habe sbt aufgegeben, da es mehr Probleme verursachte als es löste. Ich bin tatsächlich zu Gradle gewechselt.
Stelle dir das vor.
quelle
Ich bin ziemlich neu in Gradle und sehr neu in sbt - was ich bisher an sbt wirklich mag, ist die interaktive Konsole. Ich kann Befehle wie "inspizieren" verwenden, um eine bessere Vorstellung davon zu bekommen, was los ist. AFAIK gradle bietet so etwas nicht atm.
quelle
Sbt und gradle basieren beide auf statisch typisierten Sprachen ... aber sbt hat nur wenige Vorteile:
quelle