2

build.sbt

scalaVersion := "2.11.4"

project/build.properties

sbt.version=0.13.7

Then

> show scalaVersion
[info] 2.11.4
> show crossScalaVersions
[info] List(2.10.4)
> inspect crossScalaVersions
[info] Setting: scala.collection.Seq[java.lang.String] = List(2.10.4)
[info] Description:
[info]  The versions of Scala used when cross-building.
[info] Provided by:
[info]  */*:crossScalaVersions
[info] Defined at:
[info]  (sbt.Defaults) Defaults.scala:237
[info] Delegates:
[info]  *:crossScalaVersions
[info]  {.}/*:crossScalaVersions
[info]  */*:crossScalaVersions
[info] Related:
[info]  */*:crossScalaVersions

It seems like crossScalaVersions should be List(2.11.4).

Look at SBT's source code, that's also what I would think.

crossScalaVersions := Seq(scalaVersion.value)

Why doesn't crossScalaVersions correspond to scalaVersion?

Paul Draper
  • 78,542
  • 46
  • 206
  • 285

1 Answers1

3

scalaVersion.value is context-dependent. So in Defaults.scala it's */*:scalaVersion from appConfiguration.value.provider.scalaProvider. It's the version used to compile your project's definition, including your build.sbt file (sbt 0.13.7 uses 2.10.4 scala-compiler to compile your project definitions). And that the only way as your project's definitions (including scalaVersion) isn't compiled yet when Defaults executed and crossScalaVersions defined. So, */*:crossScalaVersions depends on */*:scalaVersion not proj/*:scalaVersion.

Just compare Provided by with explicit scalaVersion := 2.11.4 inside build.sbt:

> inspect scalaVersion
[info] Setting: java.lang.String = 2.11.4
[info] Description:
[info]  The version of Scala used for building.
[info] Provided by:
[info]  {file:/Users/user/dev/proj/}proj/*:scalaVersion
[info] Defined at:
[info]  /Users/user/dev/proj/build.sbt:1
[info] Reverse dependencies (D=derives):
[info]    *:allDependencies
[info]  D *:scalaBinaryVersion
[info]    *:libraryDependencies
[info]    *:scalaInstance
[info]    *:crossScalaVersions
[info]    *:update
[info] Delegates:
[info]  *:scalaVersion
[info]  {.}/*:scalaVersion
[info]  */*:scalaVersion
[info] Related:
[info]  */*:scalaVersion

And without one (just empty project):

> inspect scalaVersion
[info] Setting: java.lang.String = 2.10.4
[info] Description:
[info]  The version of Scala used for building.
[info] Provided by:
[info]  */*:scalaVersion
[info] Defined at:
[info]  (sbt.Defaults) Defaults.scala:232
[info] Reverse dependencies:
[info]  *:allDependencies
[info]  *:libraryDependencies
[info]  *:update
[info]  *:scalaInstance
[info] Delegates:
[info]  *:scalaVersion
[info]  {.}/*:scalaVersion
[info]  */*:scalaVersion
[info] Related:
[info]  */*:scalaVersion

So, you just need to redefine */*:scalaVersion in your build.sbt:

scalaVersion in GlobalScope := "2.11.2"
dk14
  • 22,206
  • 4
  • 51
  • 88
  • They've dramatically changed API - so now they use macros `.value` for keys evaluation instead of `crossScalaVersions in GlobalScope <<= Seq(scalaVersion).join`, so it was previously dependent on nearest `scala-version`. Now it depends on scalaVersion in GlobalScope, so you can just put `scalaVersion in GlobalScope := "2.11.2"` inside your `buid.sbt` to fix problem – dk14 Jan 26 '15 at 23:58