Vì vậy, sau khi tìm hiểu về điều này một chút, tôi đã đưa ra một giải pháp. Trước tiên, bạn cần phải phá vỡ dự án của bạn thành hai dự án phụ. gen
có tất cả các nguồn bao gồm mã máy phát điện của bạn. use
tùy thuộc vào gen
và sử dụng trình tạo.
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
}
}
Trong trường hợp này, tôi đã tạo các tệp .java để tôi truyền vào máy phát điện javaSource
. Điều quan trọng là không phải khi sử dụng các bộ phát nguồn như chúng ta đang ở đây, tác vụ được thực thi phải trả về một Seq[File]
của tất cả các tệp được tạo để sbt có thể quản lý chúng. Trong quá trình thực hiện này, trình tạo của chúng tôi xuất ra các tên tệp đường dẫn đầy đủ để tiêu chuẩn và chúng tôi lưu chúng vào một tệp tạm thời.
Như với tất cả mọi thứ Scala và chắc chắn SBT, bạn có thể làm bất cứ điều gì, chỉ cần đào sâu vào nó.
Nguồn
2012-07-25 14:47:37
Tôi cũng đã đấu vật với kịch bản chính xác này. Tôi không có câu trả lời cho bạn, vẫn là một newbie sbt. Nhưng sẽ chờ đợi một câu trả lời là tốt. –