2014-05-14 31 views
1

我有一个项目定义如下:使用不同的设置编译在不同的命令

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

我不会造成额外的命令,我会创建一个额外的配置,如@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时,才会匹配过滤器谓词。

Btw。您可能还需要考虑定义不同的unmanagedSourceDirectories和/或定义includeFilter的可能性。

+0

谢谢!有用! – mdemarne

+0

如果作品不需要感谢,只需接受/投票就够了;) – lpiepiora

相关问题