Почему crossScalaVersion не является scalaVersion?

build.sbt

scalaVersion := "2.11.4"

проект /build.properties

sbt.version=0.13.7

затем

> 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

Это похоже на crossScalaVersions должно быть List(2.11.4),

Посмотрите на исходный код SBT, я тоже так думаю.

crossScalaVersions := Seq(scalaVersion.value)

Почему не crossScalaVersions соответствовать scalaVersion?

1 ответ

scalaVersion.value зависит от контекста. Так в Defaults.scala его */*:scalaVersion от appConfiguration.value.provider.scalaProvider, Это версия, используемая для компиляции определения вашего проекта, включая ваш build.sbt файл (сб 0.13.7 использования 2.10.4 scala-компилятор для компиляции определений вашего проекта). И это единственный способ, как определения вашего проекта (в том числе scalaVersion) еще не скомпилирован, когда Defaults выполнено и crossScalaVersions определены. Так, */*:crossScalaVersions зависит от */*:scalaVersion не proj/*:scalaVersion,

Просто сравните Provided by с явным scalaVersion := 2.11.4 внутри 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

И без одного (просто пустой проект)

> 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

Итак, вам просто нужно переопределить */*:scalaVersion в вашем build.sbt:

scalaVersion in GlobalScope := "2.11.2"
Другие вопросы по тегам