Как заставить sbt разрешать зависимости с scalaVersion, совместимым с зависимым проектом - PullRequest
2 голосов
/ 21 февраля 2020

Рассмотрим следующее содержимое некоторого 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, но я видел ту же проблему в разных версиях, никакие предыдущие объяснения онлайн не помогли мне понять / обойти проблему.

...