SBT (software)
Original author(s) | Mark Harrah |
---|---|
Developer(s) | Lightbend and the community |
Stable release | |
Repository |
github |
Development status | Active |
Written in | Scala |
Operating system | Cross-platform |
Platform | Java |
Type | Build automation |
License | BSD License |
Website |
www |
sbt is an open source build tool for Scala and Java projects, similar to Java's Maven or Ant.
Its main features are:
- native support for compiling Scala code and integrating with many Scala test frameworks
- build descriptions written in Scala using a DSL
- dependency management using Ivy (which supports Maven-format repositories)
- continuous compilation, testing, and deployment
- integration with the Scala interpreter for rapid iteration and debugging
- support for mixed Java/Scala projects
Sbt is the de facto build tool in the Scala community,[3] used by the Lift web framework[4] and Play Framework.
Scala's commercial outlet, Lightbend Inc., 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.[5] When continuous compilation mode is entered, the Scala compiler is instantiated only once, which eliminates subsequent startup costs, and 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.[6] The popularity of the incremental compilation has prompted Typesafe to extract this feature in the form of an independent component called Zinc.[5]
Sbt had already fed back into the Scala standard library before, when its process API was adopted in Scala 2.9.[7]
Build files
An sbt build can be defined using a .sbt
file [8] Below is an example of .sbt
build definition:
def junit = "junit" % "junit" % "4.8"
def akkaVersion = "2.4.2"
def akkaActor = "com.typesafe.akka" %% "akka-actor" % akkaVersion
def akkaCluster = "com.typesafe.akka" %% "akka-cluster" % akkaVersion
lazy val root = (project in file(".")).
aggregate(app).
settings(
inThisBuild(List(
// Set the Scala version used by this build to 2.11.7.
scalaVersion := "2.11.7",
// Set the version to 0.1.0-SNAPSHOT.
version := "0.1.0-SNAPSHOT"
)),
name := "my-project"
)
lazy val app = (project in file("app")).
settings(
name := "app",
// Add a single dependency, for tests.
libraryDependencies += junit % Test,
// Add multiple dependencies.
libraryDependencies ++= List(akkaActor, akkaCluster),
// Use the isSnapshot setting to determine the repository to publish to.
publishTo := {
val nexus = "https://oss.sonatype.org/"
if (isSnapshot.value) Some("sonatype-staging" at nexus + "service/local/staging/deploy/maven2")
else Some("sonatype-oss-snapshots" at nexus + "content/repositories/snapshots")
}
)
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.[9] 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.[10]
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.
Comparison and criticism
As with most software tools, sbt has found advocates and critics. It is often compared against Maven, which is a standard build tool in the Java world. In particular, the domain specific language used for sbt build files has attracted criticism as being cryptic compared to the pure declarative approach of Maven's XML files. Furthermore, an incompatible change in the file format and layout was introduced with the version jump from 0.7 to 0.10. Due to the maturity of Maven and sbt being rather young, it has also been said that Maven provides a greater number of plugins and that sbt's documentation is lacking, although others say that the quality of documentation is improving.[11][12]
The sbt project uses sbt to build itself, and 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 a Debian package.[13]
See also
References
- ↑
- ↑ sbt Team (2016-07-17). "sbt 0.13.12 is released".
- ↑ Public repositories hosted on github which mention sbt
- ↑ Getting started for Lift
- 1 2 "Zinc and Incremental Compilation". typesafe's blog. 13 August 2012. Retrieved 22 August 2012.
- ↑ Goldin, Evgeny. "sbt Scala Build Tool". Retrieved 7 May 2012.
- ↑ "Scala 2.9.0 final". 12 May 2011. Retrieved 22 August 2012.
- ↑ sbt: .sbt build definition
- ↑ "Plugins". sbt. Retrieved 17 October 2014.
- ↑ "sbt Community Plugins". Retrieved 17 October 2014.
- ↑ "Is sbt the best way to manage Scala projects if your first priority is developer efficiency?". Quora. 25 July 2012. Retrieved 22 August 2012.
- ↑ Coda Hale (29 November 2011). "The Rest Of The Story". Retrieved 22 August 2012. This is a blog entry giving context to a linked e-mail in which problems with sbt are outlined.
- ↑ "Debian Bug report logs - #639910, RFP: simple-build-tool -- for scala and java projects". Retrieved 28 Jun 2015., includes conversation with an sbt developer.