在sbt中手动调用sourceGenerators

rei*_*kje 6 scala sbt

sourceGenerators in Compile用来生成一些Scala源文件来定位\ scala-2.10\src_managed.当我运行时sbt compile,源代码与src\main\scala下的常规代码一起生成和编译.

但是,如果我想在不编译的情况下单独生成源代码呢?我正在寻找的是这个流程:

  1. 调用任务来生成源代码
  2. 在我的常规源中使用生成的IDE帮助来源
  3. 编译一切

如何实现这一目标?

Mar*_*ing 3

更新

如果我现在猜对了,您希望能够单独调用源生成器。为此,您可以简单地在您的文件中的某个位置定义一个这样的自定义/build.sbt任务/project/Project.scala

val generateSources = taskKey[List[File]]("generate sources")

generateSources <<= 
  (sourceGenerators in Compile) { _.join.map(_.flatten.toList) }
Run Code Online (Sandbox Code Playgroud)

然后您可以从 sbt 控制台手动调用生成器,如下所示:

> generateSources
[success] Total time: 0 s, completed 07.04.2014 13:42:41
Run Code Online (Sandbox Code Playgroud)

旁注: 不过,如果您唯一需要的就是获得 IDE 支持,我建议您设置 IDE 来生成源代码。


旧答案供将来参考

您不需要执行任何特殊操作即可使用来自非生成的类或对象的生成的类或对象。

在您的/build.sbt/project/Project.scala文件中定义源生成器:

sourceGenerators in Compile <+= sourceManaged in Compile map { dir =>
  val file = dir / "A.scala"
  IO.write(file, "class A(val name: String)")
  Seq(file)
}
Run Code Online (Sandbox Code Playgroud)

然后编写一些代码来创建类 A 的实例/src/main/scala/B.scala

object B extends App {
  val a = new A("It works")
  println(a.name)
}
Run Code Online (Sandbox Code Playgroud)

如果您从 sbt 编译此代码,它将在编译时考虑生成的代码和非生成的代码:

> run
[info] Compiling 2 scala sources to <...>
[info] Running B
It works
[success] Total time: 0 s, completed 07.04.2014 13:15:47
Run Code Online (Sandbox Code Playgroud)