Entonces, después de investigar un poco, he encontrado una solución. En primer lugar, debe dividir su proyecto en dos subproyectos. gen
tiene toda la fuente que incluye su código de generador. use
depende de gen
y utiliza el generador.
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
}
}
En este caso, yo estaba generando archivos .java así que pasé en javaSource
al generador.
No es importante que al usar generadores de origen como estamos aquí, la tarea ejecutada debe devolver un Seq[File]
de todos los archivos que se generaron para que sbt pueda administrarlos. En esta implementación, nuestro generador genera los nombres de los archivos de ruta completa a la salida estándar y los guardamos en un archivo temporal.
Al igual que con todas las cosas Scala y seguramente SBT, puede hacer cualquier cosa, solo necesita profundizar en ella.
Yo también he estado luchando con este escenario exacto. No tengo una respuesta para ti, sigue siendo un novato sbt. Pero también estará esperando una respuesta. –