我的项目定义如下:
lazy val tests = Project(
id = "tests",
base = file("tests")
) settings(
commands += testScalalib
) settings (
sharedSettings ++ useShowRawPluginSettings ++ usePluginSettings: _*
) settings (
libraryDependencies <+= (scalaVersion)("org.scala-lang" % "scala-reflect" % _),
libraryDependencies <+= (scalaVersion)("org.scala-lang" % "scala-compiler" % _),
libraryDependencies += "org.tukaani" % "xz" % "1.5",
scalacOptions ++= Seq()
)
我想有三个不同的命令,它们只会编译这个项目中的一些文件。例如,上面添加的testScalalib
命令应该只编译一些特定的文件。
到目前为止,我最好的尝试是:
lazy val testScalalib: Command = Command.command("testScalalib") { state =>
val extracted = Project extract state
import extracted._
val newState = append(Seq(
(sources in Compile) <<= (sources in Compile).map(_ filter(f => !f.getAbsolutePath.contains("scalalibrary/") && f.name != "Typers.scala"))),
state)
runTask(compile in Compile, newState)
state
}
不幸的是,当我使用该命令时,它仍然编译整个项目,而不仅仅是指定的文件......
你知道我应该怎么做吗?
答案 0 :(得分:0)
我认为您最好的选择是创建不同的配置,例如compile
和test
,并拥有适合您需求的相应设置值。阅读官方sbt文档中的Scopes和/或How to define another compilation scope in SBT?
答案 1 :(得分:0)
我不会创建额外的命令,我会创建一个额外的配置,正如@JacekLaskowski建议的那样,并根据他引用的答案。
你可以这样做(使用Sbt 0.13.2)和Build.scala
(你当然可以在build.sbt
中做同样的事情,并使用不同语法的旧Sbt版本)
import sbt._
import Keys._
object MyBuild extends Build {
lazy val Api = config("api")
val root = Project(id="root", base = file(".")).configs(Api).settings(custom: _*)
lazy val custom: Seq[Setting[_]] = inConfig(Api)(Defaults.configSettings ++ Seq(
unmanagedSourceDirectories := (unmanagedSourceDirectories in Compile).value,
classDirectory := (classDirectory in Compile).value,
dependencyClasspath := (dependencyClasspath in Compile).value,
unmanagedSources := {
unmanagedSources.value.filter(f => !f.getAbsolutePath.contains("scalalibrary/") && f.name != "Typers.scala")
}
))
}
现在当你调用compile
时,一切都会被编译,但当你只调用api:compile
匹配过滤谓词的类时。
顺便说一下。您可能还想了解定义不同unmanagedSourceDirectories
和/或定义includeFilter
的可能性。