Vor- und Nachteile der Verwendung von sbt vs maven im Scala-Projekt [geschlossen]


138

Welches Build-Tool ist das beste für Scala? Was sind die Vor- und Nachteile von jedem von ihnen? Wie bestimme ich, welche davon in einem Projekt verwendet werden sollen?


5
Ich bin für Scala-Projekte von Maven zu Gradle gewechselt, da es mehrere Module unterstützt. Die Twitter- Erfahrung mit SBT wird von ihnen als "blendender Schmerz" beschrieben und sie versuchen, sich davon zu entfernen (mit Maven als Lücke in diesem Prozess).
Ben Manes

24
Noch eine coole geschlossene Frage ...
Cedric H.

14
Ich sehe so viele gute Fragen, die gerade geschlossen sind. Ich weiß nicht, wer diesen Leuten die Macht gibt, willkürlich zu entscheiden, ob sie eine Frage schließen oder nicht. Ich achte nicht einmal mehr darauf, ob sie nahe sind oder nicht.
user1888243

2
Zustimmen. Zum Glück haben wir 2 Antworten, bevor diese Frage geschlossen wird. Schlecht für diejenigen, die
abstimmen

Antworten:


83

Wir verwenden Maven, um Scala-Projekte bei der Arbeit zu erstellen, da es sich gut in unseren CI-Server integrieren lässt. Wir könnten natürlich einfach ein Shell-Skript ausführen, um einen Build zu starten, aber wir haben eine Reihe anderer Informationen aus Maven, die wir in CI aufnehmen möchten. Das ist ungefähr der einzige Grund, warum ich mir vorstellen kann, Maven für ein Scala-Projekt zu verwenden.

Andernfalls verwenden Sie einfach SBT. Sie erhalten Zugriff auf die gleichen Abhängigkeiten (wirklich das Beste an Maven, IMHO). Sie erhalten auch die inkrementelle Zusammenstellung, die riesig ist. Die Möglichkeit, eine Shell innerhalb Ihres Projekts zu starten, ist ebenfalls großartig.

ScalaMock funktioniert nur mit SBT, und Sie werden das wahrscheinlich eher als eine Java-Spottbibliothek verwenden wollen. Darüber hinaus ist es viel einfacher, SBT zu erweitern, da Sie vollständigen Scala-Code in die Build-Datei schreiben können, sodass Sie nicht die ganze Rigamarole des Schreibens eines Mojo durchlaufen müssen.

Kurz gesagt, verwenden Sie nur SBT, es sei denn, Sie benötigen wirklich eine enge Integration in Ihren CI-Server.


21
Ich bin mit keinem der oben genannten Punkte einverstanden, wollte aber nur darauf hinweisen, dass ich gerade ScalaMock 3 schreibe. Eines der Hauptziele ist es, die Unterstützung anderer Build-Systeme zu vereinfachen.
Paul Butcher

1
Der Vollständigkeit halber ist zu erwähnen, dass ScalaMock 2 mit jedem Build-System (es ist nur ein Glas) einwandfrei funktioniert, solange Sie keine generierten Mocks verwenden müssen (dh solange Sie nur Merkmale / Schnittstellen verspotten müssen) ).
Paul Butcher


3
Warum haben sie nicht einfach eine inkrementelle Zusammenstellung für Maven geschrieben? IMHO, sbt ist ein archäisches Beispiel für ein unbehandeltes NIH-Syndrom ...
Cpt. Senkfuss

1
Warum Probleme mit CI aufgrund von SBT?
Daniel

21

Die Frage läuft Gefahr, nur viele Meinungen zu generieren; Es wäre besser, eine klare Liste der Anforderungen oder eine Beschreibung Ihrer Umgebung, Vorkenntnisse usw. zu haben.

FWIW, es gibt mehr Meinungen in diesem Scala-Mailinglisten-Thread .

Meine 2c sind: Gehen Sie mit sbt, wenn Sie keine spezifischen Anforderungen haben

  • Für einfache Projekte ist es völlig mühelos (Sie benötigen nicht einmal eine Build-Datei, bis Sie Abhängigkeiten haben).
  • Es wird häufig in Scala Open Source-Projekten verwendet. Sie können sich leicht über die Konfiguration informieren, indem Sie einen Blick in die Projekte anderer Personen werfen. Außerdem setzen viele Projekte voraus, dass Sie sbt verwenden, und stellen Ihnen vorgefertigte Anweisungen zum Kopieren und Einfügen zur Verfügung, mit denen Sie sie als Abhängigkeit zu Ihrem Projekt hinzufügen können.
  • Wenn Sie IntelliJ IDEA verwenden, kann es vollständig integriert werden. Sie können IDEA Verwendung sbt haben kontinuierlich Ihr Projekt zu kompilieren, und vice versa Sie sbt verwenden können schnell generieren IDEA Projekte . Letzteres ist äußerst nützlich, wenn Sie sich in einem "Snapshot" -Zyklus befinden, der von anderen Ihrer eigenen Bibliotheken abhängt, die von der Nebenversion zur Nebenversion verschoben werden. Schließen Sie einfach das Projekt, aktualisieren Sie die Version in der Build-Datei und führen Sie die aus gen-ideaAufgabe und öffnen Sie das Projekt erneut: Aktualisierungen abgeschlossen.
  • kommt bereit , mit den meisten Aufgaben müssen Sie ( compile, test, run, doc, publish-local, console) - das ist consoleeine der besten Features ist.
  • Einige Leute heben die Funktion hervor, dass Abhängigkeiten Quell-Repositorys sein können, die direkt von GitHub abgerufen werden. Ich habe das nicht benutzt und kann es hier nicht kommentieren.

Einige Leute hassen sbt, weil es Ivy für das Abhängigkeitsmanagement verwendet (ich kann seine Vor- und Nachteile nicht kommentieren, aber meistens ist es kein Problem), andere hassen sbt, weil Sie die Build-Datei in Form von a angeben Scala DSL statt XML. Einige Leute waren enttäuscht, dass sich das Format von sbt von v0.7 auf v0.10 geändert hat, aber natürlich wirkt sich die Migration nicht auf Sie aus, wenn Sie von vorne beginnen.


27
Ich hasse sbt, weil es den Missbrauch symbolischer Operatoren und einige dumme Entscheidungen, wie z. B. die Unterstützung von .sbt- und .scala-Definitionsformaten, unterstützt, diese aber an verschiedenen Stellen platziert und Anweisungen in .sbt durch mindestens leere Zeilen usw. getrennt werden müssen. Die Dokumente von sbt verbessern sich aber momentan nicht gut genug. Was ich am meisten vermisse, sind einige vollständige (minimal bis realistisch komplexe) .sbt / .scala-Beispieldateien, die Zeile für Zeile erklärt werden und alle sbt-Funktionen abdecken. Das heißt, ich benutze sbt täglich, weil Maven viel mehr saugt.
Xiefei

6
Schade, dass diese Frage geschlossen wurde, ich bin mir sicher, dass es auch sachliche Unterschiede gibt: Zum Beispiel diesen Auszug aus dem Manning-Buch über SBT: "Wenn es Abhängigkeiten zwischen Maven-Zielen gibt (sagen wir, ein Ziel erzeugt eine Datei, die von einem anderen konsumiert wird). Dann können Sie Ihren Build nicht mit Maven parallelisieren. Mit sbt müssen Sie eine explizite Abhängigkeit zwischen Tasks angeben. Dadurch kann sbt Tasks standardmäßig parallel ausführen. Wenn Task A von B abhängt und C auch von B abhängt, dann sbt führt Aufgabe B aus und führt dann A und C parallel aus. " Hoffe, dieser Kommentar hilft einigen Lesern.
Jhegedus

19
Ich fand diesen Thread sehr nützlich. Ich denke sehr oft, dass Stackoverflow-Moderatoren Threads zu eifrig schließen. Wen kümmert es, wenn sie "off topic" sind, wenn sie sehr oft genau das sind, wonach die Benutzer suchen (und durch Websuche finden). Es ist, als ob Stackoverflow-Mods versuchen, xkcd 979 absichtlich neu zu erstellen .
Ville

3
@Ville Meine Gedanken auch. Das Downvoting, Bearbeiten und Schließen ist zu aggressiv geworden.
Ankush981

2
Für alle, die sich das jetzt ansehen, wurden die Beschwerden von @ xiefei angesprochen. SBT hat viele der benutzerdefinierteren Operatoren / Syntax entfernt, und Anweisungen in / sbt-Dateien benötigen keine Leerzeichen mehr.
Grogs
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.