Sbt 根据设置将项目包括在建';s值,例如Scalaversation?

Sbt 根据设置将项目包括在建';s值,例如Scalaversation?,sbt,Sbt,我有一个Scala项目,分为几个子项目: lazy val core: Seq[ProjectReference] = Seq(common, json_scalaz7, json_scalaz) 我想在当前使用的Scala版本上设置corelazy val的条件,因此我尝试了以下方法: lazy val core2: Seq[ProjectReference] = scalaVersion { case "2.11.0" => Seq(common, json_scalaz7)

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

lazy val core: Seq[ProjectReference] = Seq(common, json_scalaz7, json_scalaz)
我想在当前使用的Scala版本上设置
core
lazy val的条件,因此我尝试了以下方法:

lazy val core2: Seq[ProjectReference] = scalaVersion {
    case "2.11.0" => Seq(common, json_scalaz7)
    case _        => Seq(common, json_scalaz7, json_scalaz)
}
简单地说,我想排除Scala 2.11.0的
json\u scalaz
(当
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
你知道怎么解决这个问题吗

更新

我使用的是sbt版本0.12.4 这个项目是Lift项目,它根据
“2.10.0”、“2.9.2”、“2.9.1-1”、“2.9.1”进行编译,现在我们正致力于使用2.11.0
进行编译。因此,创建一个compileall任务是不现实的,因为它需要很长时间

更新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()
            }
  )
lazy val scala_xml=“org.scala-lang.modules”%%“scala xml”%%“1.0.1”
lazy val scala_parser=“org.scala-lang.modules”%%“scala解析器组合器”%%“1.0.1”
...
懒惰的普通人=
coreProject(“通用”)
.settings(description:=“通用库和实用程序”,
libraryDependencies++=Seq(slf4j_api、logback、slf4j_log4j12),
libraryDependencies-Seq(scala_xml,scala_解析器)
案例=>Seq()
}
)
但是对于项目列表

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

您可以看到完整的生成文件

跨构建项目 简单地说,我想排除Scala 2.11.0的json_scalaz

sbt中对此的内置支持称为交叉构建,如中所述。以下是本节的内容,稍加修改:

crossscalaversations
设置中定义要构建的Scala版本。例如,在.sbt生成定义中:

要根据列出的所有版本进行构建,请在要使用
+
运行的操作前面加上前缀。例如:

多项目构建 sbt还内置了跨多个项目聚合任务的支持,如下所述。如果您最终需要的是正常的内置任务,如
compile
test
,那么您可以在不使用
json\u scalaz
的情况下设置一个虚拟聚合

lazy val without-jsonscalaz=(文件中的项目(“without-json-scalaz”))。
.aggregate(liftProjects filterNot{{u==json\u scalaz}:})
在shell中,您应该能够将其用作:

> ++2.11.0
> project withoutJsonScalaz
> test
从多个作用域获取值 您可能感兴趣的另一个功能是。除了通常的聚合和交叉构建之外,它还能够遍历多个项目。您需要创建一个类型为
ScopeFilter
的设置,并根据
scalaBinaryVersion.value
进行设置。使用范围筛选器,您可以执行以下操作:

val coreProjects=settingKey[ScopeFilter](“我的核心项目”)
val compileAll=taskKey[Seq[sbt.inc.Analysis]](“全部编译”)
核心项目:={
(scalaBinaryVersion.value)匹配{
案例“2.10”=>ScopeFilter(在项目中(通用、json_scalaz7、json_scalaz))
}
}
compileAll:=compileAllTask.value
lazy val compileAllTask=Def.taskDyn{
val f=coreProjects.value
(编译中编译)所有f
}

在这种情况下,
compileAll
+compile
具有相同的效果,但您可以聚合结果并执行类似的有趣操作。

谢谢您的回答,但交叉编译此项目将花费太长时间,我用更多的细节更新了问题。一旦你得到了项目列表,你将如何处理它?如果你要运行任务,难道不是你想要的吗?我试图解决的问题是:json_scalaz项目依赖于scalaz6,它不是为scala 2.11.0构建的,而是为你运行的
测试
编译
等项目而构建的?根项目aka
lift framework
还是在单个子项目中?我已经更新了答案,包括如何生成替代聚合。我最终做了一些基于“多项目构建”解决方案的事情。
> +compile
> ++2.11.0
> project withoutJsonScalaz
> test