scalatutorial.de

Stufe 6Werkzeuge und Oberflächen · Lektion 29 von 34

Kommandozeile: scala und sbt

Aktualisiert am 24. September 20263 Min. LesezeitSchritt 1/6 dieser Stufe

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:

 Terminal
$ 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 erzeugen

Einstellungen stehen als Direktiven direkt im Quelltext, oft in einer eigenen Datei project.scala:

project.scalaScala 3
//> 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 -feature

Das 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:

 Terminal
$ sbt new scala/scala3.g8

sbt fragt nach einem Namen und erzeugt diese Struktur:

Verzeichnisaufbau eines sbt-Projektshallo-projekt/├── build.sbt├── project/│ └── build.properties├── src/│ ├── main/scala/│ │ └── Main.scala│ └── test/scala/│ └── MainSuite.scala└── target/ (erzeugt)
Der typische Aufbau eines sbt-Projekts.

build.sbt

build.sbtsbt
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:

 Terminal
$ 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
BefehlWirkung
compileübersetzt den Programmcode
runstartet das Programm (fragt nach, wenn es mehrere @main gibt)
testführt alle Tests aus
testOnly *KundeSuitenur bestimmte Tests
consoleREPL mit dem Projektcode und allen Abhängigkeiten
cleanlöscht übersetzte Dateien
packageerzeugt eine JAR-Datei
reloadliest 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:

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.

Passt dazu