具有子模块和多个scala版本的sbt

具有子模块和多个scala版本的sbt,scala,sbt,Scala,Sbt,我正在使用以下模块和依赖项构建scala应用程序: 共享库“公共” 模块“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 commo

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

  • 共享库“公共”
  • 模块“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)
我读过一些关于交叉缩放的文章,但是无论我在根构建中尝试什么组合,或者在公共构建中尝试什么组合,我都无法使它正常工作

有线索吗?
顺便说一句,我使用的是sbt 0.13.8。

根据我的经验,如果您需要任何额外的环(如此要求),sbt多模块构建非常难以可靠地工作

您是否考虑过实现这一点的更简单方法:

  • 发布您的公共依赖项(
    sbt publish local
    如果您只需要自己访问它)
  • 做两个项目A和B
  • 将A和B导入作为依赖项共同使用
使用裸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)
这就行了

现在。任何项目的编译都会导致包的创建。甚至对于
根目录
。如果您跟随控制台,在某个时候它会显示:

Packaging /project/com.github.atais/target/scala-2.10/root_2.10-0.1.jar
正如您所看到的,sbt需要决定一些Scala版本,只是为了构建这个jar!也就是说,您的项目
A
B
必须有一个通用的Scala版本,这样它们就可以聚合到一个通用的项目

因此,您不能拥有:

lazy val root = (project in file("."))
                .aggregate(common, A, B)
如果它们不共享任何Scala版本,则可以使用构建它们

但是sbt横渡前往救援 您可以使用插件来帮助您

项目/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)

然后它就起作用了:-)

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