तो, इस पर थोड़ा खोदने के बाद, मैं एक समाधान के साथ आया हूं। सबसे पहले, आपको अपनी परियोजना को दो उप परियोजनाओं में तोड़ने की जरूरत है। 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
में पारित कर दिया।
यह महत्वपूर्ण नहीं है कि स्रोत जेनरेटर का उपयोग करते समय हम यहां मौजूद हैं, निष्पादित कार्य को उत्पन्न होने वाली सभी फ़ाइलों में से Seq[File]
वापस करना होगा ताकि एसबीटी उन्हें प्रबंधित कर सके। इस कार्यान्वयन में, हमारा जनरेटर पूर्ण पथ फ़ाइल नामों को मानक आउटपुट आउटपुट करता है और हम उन्हें एक अस्थायी फ़ाइल में सहेजते हैं।
सभी चीजों के साथ स्कैला और निश्चित रूप से एसबीटी, आप कुछ भी कर सकते हैं, बस इसमें खोदने की जरूरत है।
स्रोत
2012-07-25 14:47:37
मैं भी इस सटीक परिदृश्य के साथ कुश्ती कर रहा हूं। मेरे पास आपके लिए कोई जवाब नहीं है, फिर भी एक एसबीटी नौसिखिया। लेकिन एक जवाब के लिए भी इंतजार कर रहे हैं। –