Stufe 6Werkzeuge und Oberflächen · Lektion 29 von 34
Kommandozeile: scala und sbt
Für Scala gibt es zwei Kommandozeilenwerkzeuge, die sich gut ergänzen: den Befehl scala (Scala CLI) für Skripte und kleine Programme und sbt, das verbreitetste Build-Werkzeug für richtige Projekte mit mehreren Dateien, Tests und Abhängigkeiten.
Scala CLI: der scala-Befehl
Für Einzeldateien und kleine Werkzeuge genügt der scala-Befehl:
$ scala run hallo.scala # übersetzen und starten
$ scala compile . # alle Dateien im Ordner übersetzen
$ scala test . # Tests ausführen
$ scala repl . # REPL mit dem Code des Ordners
$ scala fmt . # Code formatieren
$ scala --power package . -o werkzeug --assembly # ausführbare JAR erzeugenEinstellungen stehen als Direktiven direkt im Quelltext, oft in einer eigenen Datei project.scala:
//> using scala 3.9.0
//> using dep com.lihaoyi::os-lib:0.11.4
//> using test.dep org.scalameta::munit:1.0.0
//> using options -deprecation -featureDas reicht für erstaunlich viel: kleine Kommandozeilenprogramme, Datenauswertungen, Prototypen. Sobald ein Projekt aus mehreren Modulen besteht, Plugins braucht oder in einer CI-Umgebung gebaut wird, ist sbt meist die bessere Wahl.
sbt: der Standard für Projekte
sbt (ursprünglich simple build tool) ist seit vielen Jahren das Build-Werkzeug der Scala-Welt. Ein neues Projekt legen Sie aus einer Vorlage an:
$ sbt new scala/scala3.g8sbt fragt nach einem Namen und erzeugt diese Struktur:
build.sbtbeschreibt das Projekt: Name, Scala-Version, Abhängigkeiten.project/build.propertieslegt die sbt-Version fest.src/main/scalaenthält den Programmcode,src/test/scaladie Tests.targetentsteht beim Übersetzen und gehört nicht in die Versionskontrolle.
build.sbt
val scala3Version = "3.9.0"
lazy val root = project
.in(file("."))
.settings(
name := "hallo-projekt",
version := "0.1.0",
scalaVersion := scala3Version,
libraryDependencies ++= Seq(
"com.lihaoyi" %% "os-lib" % "0.11.4",
"org.scalameta" %% "munit" % "1.0.0" % Test
)
)Die Datei ist selbst Scala-Code. := setzt einen Wert, ++= hängt an. Bei Abhängigkeiten sorgt %% dafür, dass automatisch die zur Scala-Version passende Variante der Bibliothek geladen wird; % Test beschränkt sie auf die Tests. Die Versionsnummern übernehmen Sie aus der Dokumentation der jeweiligen Bibliothek.
Die sbt-Shell
sbt startet beim ersten Aufruf eine JVM, was einige Sekunden dauert. Deshalb arbeitet man meist in der sbt-Shell, die offen bleibt:
$ sbt
sbt:hallo-projekt> compile
sbt:hallo-projekt> run
sbt:hallo-projekt> test
sbt:hallo-projekt> ~testQuick
sbt:hallo-projekt> console
sbt:hallo-projekt> exit| Befehl | Wirkung |
|---|---|
compile | übersetzt den Programmcode |
run | startet das Programm (fragt nach, wenn es mehrere @main gibt) |
test | führt alle Tests aus |
testOnly *KundeSuite | nur bestimmte Tests |
console | REPL mit dem Projektcode und allen Abhängigkeiten |
clean | löscht übersetzte Dateien |
package | erzeugt eine JAR-Datei |
reload | liest build.sbt nach Änderungen neu ein |
Das Tilde-Zeichen vor einem Befehl lässt ihn bei jeder gespeicherten Änderung automatisch erneut laufen. ~testQuick führt nur die Tests aus, die von der Änderung betroffen sind – so entsteht eine sehr schnelle Rückmeldung beim Programmieren.
Plugins
Erweiterungen bindet sbt über project/plugins.sbt ein. Verbreitet sind zum Beispiel:
- sbt-scalafmt zum Formatieren (
scalafmtAll), - sbt-assembly für eine einzige ausführbare JAR mit allen Abhängigkeiten,
- sbt-native-packager für Docker-Images und Installationspakete,
- sbt-scalajs für Scala.js.
Andere Build-Werkzeuge
Neben sbt gibt es Mill, das Build-Definitionen als gewöhnliche Scala-Objekte schreibt und bei großen Projekten sehr schnell ist, sowie die Möglichkeit, Scala mit Maven oder Gradle zu bauen – praktisch, wenn Scala in ein bestehendes Java-Projekt einzieht. Für den Einstieg und die meisten Bibliotheken ist sbt die Wahl mit der besten Dokumentation.