根据设置的值包括构建中的项目,例如scalaVersion?

fmp*_*ard 4 sbt

我有一个Scala项目,分为几个子项目:

lazy val core: Seq[ProjectReference] = Seq(common, json_scalaz7, json_scalaz)
Run Code Online (Sandbox Code Playgroud)

我想core在我目前正在使用的Scala版本上使用lazy val,所以我尝试了这个:

lazy val core2: Seq[ProjectReference] = scalaVersion {
    case "2.11.0" => Seq(common, json_scalaz7)
    case _        => Seq(common, json_scalaz7, json_scalaz)
}
Run Code Online (Sandbox Code Playgroud)

简单来说,我想排除json_scalazScala 2.11.0(当scalaVersion设置值为时"2.11.0").

但是这给了我以下编译错误:

[error] /home/diego/work/lift/framework/project/Build.scala:39: type mismatch;
[error]  found   : sbt.Project.Initialize[Seq[sbt.Project]]
[error]  required: Seq[sbt.ProjectReference]
[error]   lazy val core2: Seq[ProjectReference] = scalaVersion {
[error]                                                        ^
[error] one error found
Run Code Online (Sandbox Code Playgroud)

不知道怎么解决这个问题?

更新

我正在使用sbt版本0.12.4这个项目是Lift项目,它编译反对"2.10.0", "2.9.2", "2.9.1-1", "2.9.1" and now we are working on getting it to compile with 2.11.0.因此,创建一个编译所有任务是不切实际的,因为它需要很长时间.

更新2

我希望有类似的东西:

lazy val scala_xml    = "org.scala-lang.modules"     %% "scala-xml"         % "1.0.1"
lazy val scala_parser = "org.scala-lang.modules"     %% "scala-parser-combinators" % "1.0.1"

...

lazy val common =
  coreProject("common")
    .settings(description := "Common Libraties and Utilities",
            libraryDependencies ++= Seq(slf4j_api, logback, slf4j_log4j12),
            libraryDependencies <++= scalaVersion {
              case "2.11.0" => Seq(scala_xml, scala_parser)
              case _ => Seq()
            }
  )
Run Code Online (Sandbox Code Playgroud)

但是对于项目清单

请注意,根据scala版本,我添加了scala_xml和scala_parser_combinator库

您可以在此处查看完整的构建文件

Eug*_*ota 5

跨建筑项目

简单来说,我想为Scala 2.11.0排除json_scalaz

sbt中的内置支持称为交叉构建,在交叉构建项目中进行了描述.这是从有一点修正的部分:

crossScalaVersions设置中定义要构建的Scala版本.例如,在.sbt构建定义中:

crossScalaVersions := Seq("2.10.4", "2.11.0")
Run Code Online (Sandbox Code Playgroud)

要针对列出的所有版本进行构建crossScalaVersions,请为要运行的操作添加前缀+.例如:

> +compile
Run Code Online (Sandbox Code Playgroud)

多项目构建

sbt还具有内置支持,可以跨多个项目聚合任务,这将在聚合中进行描述.如果你最终需要的是正常的内置任务,比如compiletest,你可以设置一个没有的虚拟聚合json_scalaz.

lazy val withoutJsonScalaz = (project in file("without-json-scalaz")).
  .aggregate(liftProjects filterNot {_ == json_scalaz}: _*)
Run Code Online (Sandbox Code Playgroud)

从shell,你应该能够使用它:

> ++2.11.0
> project withoutJsonScalaz
> test
Run Code Online (Sandbox Code Playgroud)

从多个范围获取值

您可能感兴趣的另一个功能是ScopeFilter.这能够跨越通常的聚合和交叉构建来遍历多个项目.您需要创建一个类型为的ScopeFilter设置并根据它进行设置scalaBinaryVersion.value.使用范围过滤器,您可以:

val coreProjects = settingKey[ScopeFilter]("my core projects")

val compileAll = taskKey[Seq[sbt.inc.Analysis]]("compile all")

coreProjects := {
  (scalaBinaryVersion.value) match {
    case "2.10" => ScopeFilter(inProjects(common, json_scalaz7, json_scalaz))
  }
}

compileAll := compileAllTask.value

lazy val compileAllTask = Def.taskDyn {
  val f = coreProjects.value
  (compile in Compile) all f
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下compileAll会产生相同的效果+compile,但你可以聚合结果并做一些有趣的事情,比如sbt-unidoc.