我正在使用这些模块和依赖项构建scala应用程序:
我正在尝试将所有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。
答案 0 :(得分:1)
根据我的经验,如果您需要任何额外的环节来满足此要求,那么多模块构建对于可靠地工作来说非常挑剔。
您是否考虑过更简单的方法:
sbt publish-local
,如果您只需要自己访问它)答案 1 :(得分:1)
表示此类情况的示例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!也就是说,您的项目A
和B
必须具有通用的Scala版本,因此可以将它们聚合在一个公共项目root
中。
因此,您无法:
lazy val root = (project in file("."))
.aggregate(common, A, B)
如果他们不共享任何Scala版本,则可以使用它们构建。
您可以使用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)
然后它起作用: - )!