我有一个Scala项目,该项目分为几个子项目:
lazy val core: Seq[ProjectReference] = Seq(common, json_scalaz7, json_scalaz)
我想让core
lazy val以我正在使用的Scala版本为条件,所以我尝试了这个:
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_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" 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()
}
)
但是对于项目列表
请注意,根据scala版本,我添加了scala_xml和scala_parser_combinator库
您可以看到完整的构建文件here
答案 0 :(得分:5)
简单来说,我想为Scala 2.11.0排除json_scalaz
sbt中的内置支持称为交叉构建,在Cross-Building a Project中描述。以下是有一点修正的部分:
在
crossScalaVersions
设置中定义要构建的Scala版本。例如,在.sbt构建定义中:
crossScalaVersions := Seq("2.10.4", "2.11.0")
要针对列出的所有版本
crossScalaVersions
进行构建,请在操作前添加+
。例如:
> +compile
sbt还具有内置支持,可跨多个项目聚合任务,详见Aggregation。如果您最终需要的是compile
和test
等常规内置任务,则可以设置不带json_scalaz
的虚拟聚合。
lazy val withoutJsonScalaz = (project in file("without-json-scalaz")).
.aggregate(liftProjects filterNot {_ == json_scalaz}: _*)
从shell中,您应该能够将其用作:
> ++2.11.0
> project withoutJsonScalaz
> test
您可能感兴趣的另一个功能是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
}
在这种情况下,compileAll
与+compile
具有相同的效果,但您可以汇总结果并执行一些有趣的操作,例如sbt-unidoc。