我使用 sbt 0.13.1 创建两个模块,并创建project / MyBuild.scala来编译这两个模块。 的 MyBuild.scala:
import sbt._
import Keys._
object MyBuild extends Build {
lazy val task = project.in(file("task"))
lazy val root = project.in(file(".")) aggregate(task) dependsOn task
}
当我通过设置 scalaHome 将scala库更改为 2.11.2 时。它会去maven下载 task.jar 并失败,这很奇怪。这是一个sbt bug吗?
有github测试项目地址:test-sbt-0.13.1
答案 0 :(得分:5)
这是因为您在main build.sbt中定义了自定义scalaVersion
,这意味着它仅为根项目定义。任务项目将使用默认值:
jjst@ws11:test-sbt-0.13.1$ sbt
[...]
> projects
[info] In file:/home/users/jjost/dev/test-sbt-0.13.1/
[info] * root
[info] task
> show scalaVersion
[info] task/*:scalaVersion
[info] 2.10.4
[info] root/*:scalaVersion
[info] 2.11.2-local
因此,任务子项目生成的工件将无法供根项目使用。
您可以通过确保项目使用相同的scalaVersion
来解决此问题。保持相同项目结构的最简单方法是在项目之间共享scala版本等常见设置:
object MyBuild extends Build {
val commonSettings = Seq(
scalaVersion := "2.11.2-local",
scalaHome := Some(file("/usr/local/scala-2.11.2/"))
)
lazy val task = (project.in(file("task"))).
settings(commonSettings: _*)
lazy val root = (project.in(file("."))).
settings(commonSettings: _*).
aggregate(task).
dependsOn(task)
}
实际上,您可能希望按照Effective sbt中的建议,将项目之间共享的常用设置放在project/common.scala
下的专用文件中。
答案 1 :(得分:0)
我建议您将根项目的源从root移动到子文件夹(task2),并将它们添加为聚合。它将删除聚合并取决于相同的项目:
object MyBuild extends Build {
lazy val task = project.in(file("task"))
lazy val task2 = project.in(file("task2")) dependsOn task
lazy val root = project.in(file(".")) aggregate(task, task2)
}
这对我有用,但奇怪的是这样的非标准项目结构可以正常使用默认的scalaHome。似乎是sbt解决外部依赖的方式的问题。
P.S。这个答案并不能涵盖整个故事。请参阅@jjst的答案以澄清更多信息。