sbt与子模块和多个scala版本

时间:2016-05-02 18:04:10

标签: scala sbt

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

  • 共享库“common”
  • 模块“A”取决于“common”,只能在scala 2.10中构建
  • 模块“B”取决于“common”,只能在scala 2.11+中构建

我正在尝试将所有3个模块放在一个sbt构建中:

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。

2 个答案:

答案 0 :(得分:1)

根据我的经验,如果您需要任何额外的环节来满足此要求,那么多模块构建对于可靠地工作来说非常挑剔。

您是否考虑过更简单的方法:

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

答案 1 :(得分:1)

使用裸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 to the rescue

您可以使用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)

然后它起作用: - )!