【问题标题】:Call sourceGenerators manually in sbt在 sbt 中手动调用 sourceGenerators
【发布时间】:2014-04-07 19:51:59
【问题描述】:

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

但是如果我想单独生成源而不编译怎么办?我正在寻找的是这个流程:

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

如何做到这一点?

【问题讨论】:

  • 利用到底是什么意思?这是关于IDE设置的问题吗?因为您当然可以从生成的源到非托管的源进行交叉引用,反之亦然......
  • @I.K:是的,我已经阅读了这些帖子,但是如果您使用 sourceGenerators,我看不出如何在不运行 sbt compile 的情况下生成代码。我现在在我的应用程序的项目文件夹中添加了一个 Generators.scala 文件。然后我在 build.sbt 中添加了一个新任务(makeGamedata),它使用 Generators 类生成源代码。所以我的开发周期现在是:sbt makeGamedata > 在src/main/scala 上编写代码,使用生成的源代码 > sbt compile 编译所有内容。这很好用。现在我需要弄清楚如何在项目文件夹中对代码进行单元测试..
  • @Martin Ring:马丁,是的,它工作得很好,但它们总是一起生成和编译的。我想将生成作为一项额外任务进行,即sbt generatesrc_managed 中生成源代码> 在src/main/scala 中开发使用这些源代码的代码> 编译所有内容。
  • @reikje:我还是不明白你所说的使用这些来源的代码是什么意思?

标签: scala sbt


【解决方案1】:

更新

如果我现在回答正确,您希望能够单独调用源生成器。为此,您可以在 /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

【讨论】:

  • 是的,但在您的示例中,您在 A.scala 存在之前编写对象 B,如果没有适当的 IDE 支持和复杂的类,这将很难。还假设代码生成依赖于一些可能更改的 XML 文件,突然 A 不再具有 name 属性。那么你的编译就会失败。
  • 好的。现在我终于明白了,你的问题是什么。查看我的更新。
猜你喜欢
  • 1970-01-01
  • 2016-08-18
  • 2019-01-15
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 2015-05-23
  • 2020-03-26
  • 1970-01-01
相关资源
最近更新 更多