【问题标题】:sbt with sub-modules and multiple scala versions带有子模块和多个 scala 版本的 sbt
【发布时间】:2016-08-27 14:10:38
【问题描述】:

我正在使用这些模块和依赖项构建一个 scala 应用程序:

  • 一个共享库“common”
  • 模块“A”依赖于“common”,只能在 scala 2.10 中构建
  • 模块“B”依赖于“common”,只能在 scala 2.11+ 中构建

我试图在一个 sbt 构建中包含所有 3 个模块:

import sbt._
import Keys._

lazy val root = (project in file("."))
                .aggregate(common, A, B)

lazy val common = (project in file("common"))

lazy val A = (project in file("A"))
             .dependsOn(common)

lazy val B = (project in file("B"))
             .dependsOn(common)

我已经阅读了有关 crossScalaVersions 的内容,但是无论我在 root 构建中尝试什么组合,或者共同使用等等,我都无法使其正常工作。

有什么线索吗? 顺便说一句,我正在使用 sbt 0.13.8。

【问题讨论】:

  • sbt-doge,使用它,它解决了这种特殊情况
  • sbt-dodge 真的很有帮助,感谢指针@pfn
  • sbt-doge 根本没有解决这个问题。

标签: scala sbt


【解决方案1】:

根据我的经验,如果您需要任何额外的箍来跳过这个要求,那么 sbt 多模块构建非常挑剔才能可靠地工作。

您是否考虑过实现此目的的更简单方法:

  • 发布您的常用依赖项(sbt publish-local 如果您只需要自己访问它)
  • 制作两个项目 A 和 B
  • 将 A 和 B 导入共同作为依赖项

【讨论】:

    【解决方案2】:

    使用裸 sbt 这可能是不可能的。

    代表这种情况的示例build.sbt文件:

    lazy val common = (project in file("common"))
                      .settings(crossScalaVersions := Seq("2.10.6", "2.11.8"))
    
    lazy val A = (project in file("A"))
                 .settings(scalaVersion := "2.10.6")
                 .dependsOn(common)
    
    lazy val B = (project in file("B"))
                 .settings(scalaVersion := "2.11.8")
                 .dependsOn(common)
    

    这样就可以了。

    现在。任何项目的编译都会导致创建一个包。即使是root。如果您关注控制台,它会在某些时候显示:

    Packaging /project/com.github.atais/target/scala-2.10/root_2.10-0.1.jar
    

    如您所见,sbt 需要决定一些 Scala 版本,只是为了构建这个 jar!话虽如此,您的项目 AB必须具有通用的 Scala 版本,以便它们可以聚合到通用项目 root

    因此,你不能拥有:

    lazy val root = (project in file("."))
                    .aggregate(common, A, B)
    

    如果他们不共享任何可以用来构建的 Scala 版本。

    但是... sbt-cross 来救援

    您可以使用sbt-cross 插件来帮助您。

    project/plugins.sbt,添加

    addSbtPlugin("com.lucidchart" % "sbt-cross" % "3.2")
    

    并通过以下方式定义您的build.sbt

    lazy val common = (project in file("common")).cross
    
    lazy val common_2_11 = common("2.11.8")
    lazy val common_2_10 = common("2.10.6")
    
    lazy val A = (project in file("A"))
                 .settings(scalaVersion := "2.10.6")
                 .dependsOn(common_2_10)
    
    lazy val B = (project in file("B"))
                 .settings(scalaVersion := "2.11.8")
                 .dependsOn(common_2_11)
    
    lazy val root = (project in file("."))
                    .aggregate(common, A, B)
    

    然后它就起作用了:-)!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-22
      • 2014-08-18
      • 2016-06-22
      • 2020-12-25
      • 2016-08-22
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      相关资源
      最近更新 更多