How to share version values between project/plugins.sbt and project/Build.scala?

sbt

Solution

sbt-buildinfo

If you need to share `version` number between `build.sbt` and `hello.scala`, what would you normally do? I don't know about you, but I would use sbt-buildinfo that I wrote.

This can be configured using `buildInfoKeys` setting to expose arbitrary key values like `version` or some custom `String` value. I understand this is not exactly what you're asking but bear with me.

meta-build (turtles all the way down)

As Jacek noted and stated in Getting Started Guide, the build in sbt is a project defined in the build located in `project` directory one level down. To distinguish the builds, let's define the normal build as the proper build, and the build that defines the proper build as meta-build. For example, we can say that an sbt plugin is a library of the root project in the meta build.

Now let's get back to your question. How can we share info between `project/Build.scala` and `project/plugins.sbt`?

using sbt-buildinfo for meta-build

We can just define another level of build by creating `project/project` and add `sbt-buildinfo` to the (meta-)meta-build.

Here are the files.

In `project/project/buildinfo.sbt`:

addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.3.2")

In `project/project/Dependencies.scala`:

package metabuild

object Dependencies {
  def scalaJsVersion = "0.5.0-M2"
}

In `project/build.properties`:

sbt.version=0.13.5

In `project/buildinfo.sbt`:

import metabuild.Dependencies._

buildInfoSettings

sourceGenerators in Compile <+= buildInfo

buildInfoKeys := Seq[BuildInfoKey]("scalaJsVersion" -> scalaJsVersion)

buildInfoPackage := "metabuild"

In `project/scalajs.sbt`:

import metabuild.Dependencies._

addSbtPlugin("org.scala-lang.modules.scalajs" % "scalajs-sbt-plugin" % scalaJsVersion)

In `project/Build.scala`:

import sbt._
import Keys._
import metabuild.BuildInfo._

object Builds extends Build {
  println(s"test: $scalaJsVersion")
}

So there's a bit of a boilerplate in `project/buildinfo.sbt`, but the version info is shared across the build definition and the plugin declaration.

If you're curious where `BuildInfo` is defined, peek into `project/target/scala-2.10/sbt-0.13/src_managed/`.

Problem

I would like to share a common version variable between an sbtPlugin and the rest of the build Here is what I am trying: in `project/Build.scala`: ``` object Versions { scalaJs = "0.5.0-M3" } object MyBuild extends Build { //Use version number } ``` in `plugins.sbt`: ``` addSbtPlugin("org.scala-lang.modules.scalajs" % "scalajs-sbt-plugin" % Versions.scalaJs) ``` results in ``` plugins.sbt:15: error: not found: value Versions addSbtPlugin("org.scala-lang.modules.scalajs" % "scalajs-sbt-plugin" % Versions.scalaJs) ``` Is there a way to share the version number specification between `plugins.sbt` and the rest of the build, e.g. `project/Build.scala`?

Original source

Related problems