因此,在深入瞭解這一點後,我想出了一個解決方案。首先,你需要將你的項目分成兩個子項目。 gen
包含您的生成器代碼的所有源代碼。 use
取決於gen
並使用發生器。
import sbt._
import Keys._
import java.io.{ File ⇒ JFile, FileOutputStream }
object OverallBuild extends Build {
lazy val root = Project(id = "overall", base = file(".")).aggregate(gen, use)
lazy val gen = Project(id = "generate", base = file("gen"))
val myCodeGenerator = TaskKey[Seq[File]]("mycode-generate", "Generate My Awesome Code")
lazy val use = Project(id = "use", base = file("use"),
settings = Defaults.defaultSettings ++ Seq(
sourceGenerators in Compile <+= (myCodeGenerator in Compile),
myCodeGenerator in Compile <<=
(javaSource in Compile, dependencyClasspath in Runtime in gen) map {
(javaSource, cp) ⇒ runMyCodeGenerator(javaSource, cp.files)
})).dependsOn(gen)
def runMyCodeGenerator(javaSource: File, cp: Seq[File]): Seq[File] = {
val mainClass = "com.yourcompany.myCodeGenerator"
val tmp = JFile.createTempFile("sources", ".txt")
val os = new FileOutputStream(tmp)
try {
val i = new Fork.ForkScala(mainClass).fork(None, Nil, cp,
Seq(javaSource.toString),
None,
false,
CustomOutput(os)).exitValue()
if (i != 0) {
error("Trouble with code generator")
}
} finally {
os.close()
}
scala.io.Source.fromFile(tmp).getLines.map(f ⇒ file(f)).toList
}
}
在這種情況下,讓我在javaSource
傳遞給發電機,我產生.java文件。
當我們在這裏使用sourceGenerators時,執行的任務必須返回生成的所有文件的Seq[File]
以便sbt可以管理它們,這一點很重要。在這個實現中,我們的生成器將完整的路徑文件名輸出到標準輸出,並將它們保存到一個臨時文件中。
就像Scala和SBT的所有事情一樣,你可以做任何事情,只需要深入研究。
我也一直在摔跤這個確切的情況。我沒有爲你回答,仍然是一個新手。但也會等待答案。 – 2012-07-19 11:55:03