I know this because build.sbt knows this.
sbt-buildinfo generates Scala source from your build definitions.
addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.3.2")
For sbt 0.12, see 0.2.5.
Add the following in your build.sbt
:
buildInfoSettings
sourceGenerators in Compile <+= buildInfo
buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion)
buildInfoPackage := "hello"
(Note: in version 0.1.2, this was Seq[Scoped]
instead!)
Alternatively, if you are using Build.scala
, add the import import sbtbuildinfo.Plugin._
to it and add the module's setting through something like:
lazy val myProject = Project(
id = "myProjectName",
base = file("."),
settings = Defaults.defaultSettings ++
buildInfoSettings ++
Seq(
sourceGenerators in Compile <+= buildInfo,
buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion),
buildInfoPackage := "org.myorg.myapp"
) ++
…
)
When you reload the settings and compile, this generates the following:
package hello
/** This object was generated by sbt-buildinfo. */
case object BuildInfo {
/** The value is "helloworld". */
val name = "helloworld"
/** The value is "0.1-SNAPSHOT". */
val version = "0.1-SNAPSHOT"
/** The value is "2.9.2". */
val scalaVersion = "2.9.2"
/** The value is "0.12.0". */
val sbtVersion = "0.12.0"
}
Customize buildInfoKeys
by adding whatever keys. You can use BuildInfoKey.map
to change the generated field
name and value, add new fields with tuples, or add new fields with values computed at build-time:
buildInfoKeys ++= Seq[BuildInfoKey](
resolvers,
libraryDependencies in Test,
BuildInfoKey.map(name) { case (k, v) => "project" + k.capitalize -> v.capitalize },
"custom" -> 1234, // computed at project load time
BuildInfoKey.action("buildTime") {
System.currentTimeMillis
} // re-computed each time at compile
)
This generates:
/** The value is Seq("Sonatype Public: https://oss.sonatype.org/content/groups/public"). */
val resolvers = Seq("Sonatype Public: https://oss.sonatype.org/content/groups/public")
/** The value is Seq("org.scala-lang:scala-library:2.9.1", ...). */
val test_libraryDependencies = Seq("org.scala-lang:scala-library:2.9.1", ...)
/** The value is "Helloworld". */
val projectName = "Helloworld"
/** The value is 1234. */
val custom = 1234
/** The value is 1346906092160L. */
val buildTime = 1346906092160L
Tasks can be added only if they do not depend on sourceGenerators
. Otherwise, it will cause an infinite loop.
Here's how to change the generated the object name:
buildInfoObject := "Info"
This changes the generated object to object Info
. Changing the object name is optional, but to avoid name clash with other jars, package name should be unique.
A build number can be generated as follows. Note that cross building against multiple Scala would each generate a new number.
buildInfoKeys += buildInfoBuildNumber
If you use the sbteclipse plugin to generate projects for Eclipse, you need to tell sbteclipse
that the generated BuildInfo.scala
is a managed source, i.e., a generated source file.
To do so, you can configure sbteclipse
as follows:
EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Managed
This is explained in more detail in the sbtecliipse
documentation.
MIT License