What is the difference between build.sbt and build.scala?
I started to learn Scala and almost in every tutorial I see a build.sbt
file which describes project settings. But now I have installed giter8
and created a project from template. And generated project from template missed build.sbt
file, but it have build.scala
(which seems used for same purposes, but it is more flexible).
So what is the difference between build.sbt
and build.scala
?
Which is more preferred and why?
Solution 1:
To give a brief example, this build.sbt
:
name := "hello"
version := "1.0"
is a shorthand notation roughly equivalent to this project/Build.scala
:
import sbt._
import Keys._
object Build extends Build {
lazy val root = Project(id = "root", base = file(".")).settings(
name := "hello",
version := "1.0"
)
}
The .sbt
file can also include val
s, lazy val
s, and def
s (but not object
s and class
es).
See the SBT document called ".scala build definition", particularly the section "Relating build.sbt to Build.scala".
Consider a .scala
build definition if you're doing something complicated where you want the full expressiveness of Scala.
Solution 2:
Update July 2016 (3 years later)
Build.scala
is officially deprecated in sbt 0.13.12
The
Build
trait is deprecated in favor of the.sbt
format
PR 2530 implements that deprecation.
"Appendix: .scala
build definition" has been updated.
Solution 3:
When .sbt
s are being compiled, they are before that sort of merged with the .scala
files inside project
directory. They can't be used in recursive tasks, that is, you can't customize sbt
from sbt
, for example. For more detailed information, consider reading related section is sbt documentation: http://www.scala-sbt.org/release/docs/Getting-Started/Basic-Def.html#sbt-vs-scala-definition