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 shellThisBuild / 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 / publish23.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.compile23.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).