【问题标题】:How to force sbt to resolve dependencies with scalaVersion compatible with the dependent project如何强制 sbt 使用与依赖项目兼容的 scalaVersion 来解决依赖关系
【发布时间】:2020-06-06 06:42:03
【问题描述】:

考虑以下一些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 似乎派生自 scalaVersionThisBuildGlobal 值,默认为 2.12.x,在其中一个范围内更改 scalaVersion 可以解决上述简化示例的问题,但是如果我们添加

lazy val z = (project in file("z"))
  .settings(
    scalaVersion := "2.12.6",
  )
  .dependsOn(x)

那么我们在Global / ThisBuild 范围内为scalaVersion 选择的任何值,yz 都将无法构建。

我知道sbt "+ y/compile",但为什么sbt y/compile 不能正确默认匹配依赖项目和依赖项之间的scalaVersion?或者在解决依赖关系时可以选择正确的scalaVersion吗?


sbt "show sbtVersion" 给了我1.2.1,但我在不同版本中看到了同样的问题,以前没有在线解释帮助我理解/规避问题。

【问题讨论】:

    标签: scala sbt resolver dependency-resolver scala-version-cross-build


    【解决方案1】:

    您需要为项目定义一个 Scala 版本。它应该是最常见的版本。您可以在Cross building a project statefully 看到一个通用示例。在您的示例中,您可以这样做:

    ThisBuild / scalaVersion := "2.11.8"
    
    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")
      )
    

    或者,例如,如果您默认使用 Scala 2.12,您可以这样做:

    ThisBuild / scalaVersion := "2.12.6"
    
    lazy val y = (project in file("y"))
      .settings(
        scalaVersion := "2.12.6"
      )
      .dependsOn(x)
    
    lazy val x = (project in file("x"))
      .settings(
        crossScalaVersions := Seq("2.11.8", "2.12.6")
      )
    

    关于z 的要求,我认为这是不可能的。我认为所有子项目都应该支持项目的Scala版本。

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 2014-12-18
      • 2016-06-04
      • 2017-10-29
      • 2016-07-18
      • 1970-01-01
      • 2014-01-12
      • 2016-02-13
      • 1970-01-01
      相关资源
      最近更新 更多