Build Tools

23.1 sbt

%% appends the Scala binary version (_3); % for Java libraries; %%% for Scala.js/Native cross builds.

Project layout:

Popular plugins: sbt-assembly, sbt-native-packager (Docker, deb, rpm), sbt-scalafmt, sbt-scalafix, sbt-revolver, sbt-tpolecat (strict compiler flags), sbt-ci-release, sbt-buildinfo, sbt-jmh.

sbt new scala/scala3.g8       # create a project from a template
cd my-project
sbt                            # interactive shell
ThisBuild / scalaVersion := "3.7.1"
ThisBuild / organization := "com.example"
ThisBuild / version := "0.1.0"

lazy val root = (project in file("."))
  .settings(
    name := "my-app",
    libraryDependencies ++= Seq(
      "org.typelevel" %% "cats-effect" % "3.5.7",
      "com.lihaoyi"   %% "upickle"     % "4.1.0",
      "org.scalameta" %% "munit"       % "1.0.3" % Test
    ),
    scalacOptions ++= Seq("-deprecation", "-feature", "-Wunused:all")
  )

lazy val core = project.in(file("core"))
lazy val api = project.in(file("api")).dependsOn(core)
build.sbt
project/build.properties    (sbt.version=1.10.x)
project/plugins.sbt
src/main/scala/
src/main/resources/
src/test/scala/
sbt compile | run | test | testOnly *MySpec | console | clean | package
sbt ~compile                 # continuous (re-run on change)
sbt "run arg1 arg2"
sbt assembly                 # fat JAR (sbt-assembly plugin)
sbt scalafmtAll              # format (sbt-scalafmt)
sbt dependencyUpdates        # check updates (sbt-updates)
sbt publishLocal / publish

23.2 Mill

// build.mill
package build
import mill._, scalalib._

object app extends ScalaModule {
  def scalaVersion = "3.7.1"
  def mvnDeps = Seq(mvn"com.lihaoyi::os-lib:0.11.3")
  object test extends ScalaTests with TestModule.Munit {
    def mvnDeps = Seq(mvn"org.scalameta::munit:1.0.3")
  }
}
./mill app.run
./mill app.test
./mill -w app.compile

23.3 scala-cli

Best for scripts, small projects, prototypes, and teaching; supports //> using directives, tests, packaging, Scala.js, Scala Native, and exporting to sbt/Mill (scala --power export --sbt).