Рассмотрим следующее содержимое некоторого build.sbt
и, в частности, отсутствие исходного кода:
lazy val y = (project in file("y"))
.settings(
scalaVersion := "2.11.8",
)
.dependsOn(x)
lazy val x = (project in file("x"))
.settings(
crossScalaVersions := Seq("2.11.8", "2.12.6")
)
Здесь, sbt y/compile
, происходит сбой с
sbt.librarymanagement.ResolveException: unresolved dependency: x#x_2.11;0.1.0-SNAPSHOT: not found
, что объясняется sbt "show y/fullResolvers"
относится к
Raw(ProjectResolver(inter-project, mapped: x#x_2.12;0.1.0-SNAPSHOT))
Почему это относится к _2.12
? Я предполагаю, что, поскольку sbt "show y/allDependencies"
перечисляет
x:x:0.1.0-SNAPSHOT
в качестве зависимости, которая пропускает scalaVersion
и _2.12
, sbt не понимает (в отличие от зависимостей от внешних библиотек), какая версия scala искать. _2.12
, кажется, получен из значения ThisBuild
или Global
scalaVersion
, которое по умолчанию равно 2.12.x, изменение scalaVersion
в одной из областей решает проблему для упрощенного примера выше, но если мы добавим
lazy val z = (project in file("z"))
.settings(
scalaVersion := "2.12.6",
)
.dependsOn(x)
, то какое бы значение мы ни выбрали для scalaVersion
в области действия Global
/ ThisBuild
, либо y
, либо z
не удастся построить.
Мне известно о sbt "+ y/compile"
, но почему sbt y/compile
правильно по умолчанию не сопоставляет scalaVersion
между зависимым проектом и зависимостью? Или можно сделать правильный выбор scalaVersion
при разрешении зависимостей?
sbt "show sbtVersion"
дает мне 1.2.1
, но я видел ту же проблему в разных версиях, никакие предыдущие объяснения онлайн не помогли мне понять / обойти проблему.