これを少し掘り下げた後、私は解決策を思いつきました。まず、プロジェクトを2つのサブプロジェクトに分割する必要があります。 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がそれらを管理できるようにする必要があります。この実装では、ジェネレータがフルパスファイル名を標準出力に出力し、それらを一時ファイルに保存します。
スカラと確かにSBTのように、あなたは何かをすることができ、それを掘り下げるだけでいいです。
私もこの正確なシナリオに取り組んでいます。私はあなたのための答えはまだ、まだ初心者初心者はありません。しかし、答えも待っています。 –