当我将sbt默认scala库更改为scala 2.11.2时,找不到sbt 0.13.1多项目模块

时间:2014-09-22 10:58:49

标签: scala sbt

我使用 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

2 个答案:

答案 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的答案以澄清更多信息。