2014-05-14 32 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

相關問題