在不同命令中使用不同设置进行编译

时间:2014-05-14 21:30:49

标签: command sbt project

我的项目定义如下:

  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
  }

不幸的是,当我使用该命令时,它仍然编译整个项目,而不仅仅是指定的文件......

你知道我应该怎么做吗?

2 个答案:

答案 0 :(得分:0)

我认为您最好的选择是创建不同的配置,例如compiletest,并拥有适合您需求的相应设置值。阅读官方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的可能性。