sbt (software)
sbt is an open-source build tool for Scala and Java projects, similar to Apache's Maven and Gradle.
![]() | |
Original author(s) | Mark Harrah |
---|---|
Developer(s) | Eugene Yokota and community |
Stable release | |
Repository | |
Written in | Scala |
Operating system | Cross-platform |
Platform | Java |
Type | Build automation |
License | BSD License |
Website | scala-sbt |
Its main features are:
- Native support for compiling Scala code and integrating with many Scala test frameworks
- Continuous compilation, testing, and deployment
- Incremental testing and compilation, meaning only changed sources are re-compiled, only affected tests are re-run
- Build descriptions written in Scala using a DSL
- Dependency management using Coursier, which supports Maven-format repositories
- Integration with the Scala REPL for rapid iteration and debugging
- Support for mixed Scala/Java projects
sbt is the de facto build tool in the Scala community,[3] used, for example, by Play Framework.
Lightbend Inc., which managed sbt development in past years, has called sbt "arguably the best tool for building Scala projects", saying that its two most prominent features are incremental compilation and an interactive shell.[4] In continuous compilation mode, the Scala compiler is instantiated only once, which eliminates subsequent startup costs; source file changes are tracked so that only affected dependencies are recompiled. The interactive console allows modifying build settings on the fly and entering the Scala REPL along with all class files of the project.[5] The popularity of the incremental compilation prompted Lightbend to extract this feature in the form of an independent component called Zinc.[4]
History
Mark Harrah publicly announced sbt on 18 December 2008. It was initially an abbreviation that stood for "Simple Build Tool", but it is now known simply as "sbt".[6]
Build files
An sbt build can be defined using a .sbt
file [7] Below is an example of build.sbt
build definition:
val scalaTest = "org.scalatest" %% "scalatest" % "3.2.14"
val akkaVersion = "2.6.20"
val akkaActor = "com.typesafe.akka" %% "akka-actor" % akkaVersion
val akkaCluster = "com.typesafe.akka" %% "akka-cluster" % akkaVersion
// Set the Scala version used by this build to 2.13.10.
ThisBuild / scalaVersion := "2.13.10"
ThisBuild / version := "0.1.0-SNAPSHOT"
ThisBuild / organization := "com.example"
lazy val root = (project in file("."))
.aggregate(helloCore)
.dependsOn(helloCore)
.settings(
name := "Hello",
// Add a single dependency, for tests.
libraryDependencies += scalaTest % Test
)
lazy val helloCore = (project in file("core"))
.settings(
name := "Hello Core",
libraryDependencies += scalaTest % Test,
// Add multiple dependencies.
libraryDependencies ++= List(akkaActor, akkaCluster)
)
Example use
sbt may be invoked for each build command, or it may enter interactive mode if no command is given. To clean build products of the current build:
$ sbt clean
Multiple commands may be used on the same line. To run a single test named "Foo" and then publish exported jars:
$ sbt "testOnly Foo" publish
Extensibility and integration
The functionality of sbt can be extended through a plugin architecture.[8] A dedicated website was set up for community contributed plugins, which cover various areas such as signing, packaging, publishing and releasing artifacts, connecting to other services such as blogs and databases, or integrating with other technologies such as deploying to the Android platform.[9]
There are plugins to automatically create project files for the Eclipse and IntelliJ IDEA IDEs. On the other hand, an IntelliJ IDEA plugin allows the sbt console to be integrated into IDEA, and projects can choose to use sbt for building.
Comparisons
As with most software tools, sbt has found advocates and critics.
sbt is often compared to Apache Maven, which is a standard build tool in the Java world. In particular, the domain-specific language used for sbt build files is considered by some to be more cryptic than the pure declarative approach of Maven's XML files. (Some of this criticism may predate sbt's introduction of a more direct, macro-based syntax.)
Bootstrapped development
The sbt project is "bootstrapped" — it uses sbt to build itself, as many compilers also do, and it considers that dogfooding is a positive feature. To the Debian project, however, that is considered a circular dependency, that they try to minimize. As a result, sbt is not yet in Debian.[10]
See also
References
- sbt - Download
- eed3si9n (2023-01-05). "Announce: sbt 1.8.2". eed3si9n.com. Retrieved 2023-05-05.
- Public repositories hosted on github which mention sbt
- "Zinc and Incremental Compilation". typesafe's blog. 13 August 2012. Retrieved 22 August 2012.
- Goldin, Evgeny. "sbt Scala Build Tool". Retrieved 7 May 2012.
- Frequently Asked Questions
- sbt: .sbt build definition
- "Plugins". sbt. Retrieved 17 October 2014.
- "sbt Community Plugins". Retrieved 17 October 2014.
- "Debian Bug report logs - #639910, RFP: simple-build-tool -- for scala and java projects". Retrieved 28 Jun 2015., includes conversation with an sbt developer.