在sbt中手动调用sourceGenerators

时间:2014-04-04 10:13:07

标签: scala sbt

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

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

  1. 调用任务以生成源代码
  2. 在我的常规资源中使用生成的资源获取IDE帮助
  3. 编译所有内容
  4. 如何实现这一目标?

1 个答案:

答案 0 :(得分:3)

<强>更新

如果我现在纠正你,你希望能够单独调用源生成器。为此,您只需在/build.sbt/project/Project.scala文件中的某个位置定义这样的自定义任务:

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

generateSources <<= 
  (sourceGenerators in Compile) { _.join.map(_.flatten.toList) }

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

> generateSources
[success] Total time: 0 s, completed 07.04.2014 13:42:41

旁注: 但是我建议你设置你的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)
}

然后你编写了一些在/src/main/scala/B.scala中创建A类实例的代码:

object B extends App {
  val a = new A("It works")
  println(a.name)
}

如果从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