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

che*_*ohi 3 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
}
Run Code Online (Sandbox Code Playgroud)

当我通过设置scalaHome将scala库更改为2.11.2时.它会去maven下载task.jar并失败,这很奇怪.这是一个sbt bug吗?

有github测试项目地址:test-sbt-0.13.1

jjs*_*jst 5

这是因为您scalaVersion在main build.sbt中定义了一个自定义,这意味着它仅为根项目定义.任务项目将使用默认值:

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
Run Code Online (Sandbox Code Playgroud)

因此,任务子项目生成的工件将无法供根项目使用.

您可以通过确保您的项目使用相同的方法来解决此问题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)
}
Run Code Online (Sandbox Code Playgroud)

实际上,您可能希望将项目之间共享的公共设置放在专用文件中project/common.scala,如有效sbt中所建议的那样.