gpt4 book ai didi

code-generation - SBT 使用项目定义的生成器生成代码

转载 作者:行者123 更新时间:2023-12-03 14:56:47 24 4
gpt4 key购买 nike

我想编译一个包含 java 源代码生成器的项目,然后在单个项目中编译生成的代码。
即:编译Generator.scala,运行Generator.generate(outputDir),编译outputDir,打包成jar。
我正在尝试这个:

sourceGenerators in Compile <+= sourceManaged in Compile map { out =>
Generator.generate(out / "generated")
}

但 sbt 提示
[error] Build.scala:1: object example is not a member of package org
[error] import org.example.Generator

基本上,sbt 看不到它编译的项目中定义的 Generator。
用sbt可以按照我的方式做吗?

最佳答案

所以,在深入研究之后,我想出了一个解决方案。首先,您需要将您的项目分成两个子项目。 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
}
}

在这种情况下,我生成了 .java 文件,所以我传入了 javaSource到发电机。

重要的是不要在我们这里使用 sourceGenerators 时,执行的任务必须返回 Seq[File]生成的所有文件,以便 sbt 可以管理它们。在这个实现中,我们的生成器将完整路径文件名输出到标准输出,并将它们保存到一个临时文件中。

与 Scala 和 SBT 的所有东西一样,您可以做任何事情,只需要深入研究它。

关于code-generation - SBT 使用项目定义的生成器生成代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11509843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com