2014-04-04 47 views
6

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

但是如果我想单独生成源而不编译?我所寻找的是这样的流程:

  1. 调用生成的源代码
  2. 使用IDE辅助生成的来源,我的常规渠道
  3. 编译一切

哪有这个任务完成?

+0

你读过这些帖子:http://stackoverflow.com/a/11652418/3248346,http://stackoverflow.com/a/11640883/3248346? –

+1

你的意思是什么*利用*?这是关于IDE设置的问题吗?因为你当然可以交叉引用从生成到非托管的来源和其他方式...... –

+0

@IK:是我已阅读帖子,但如果您使用源代码发生器,我不知道如何生成代码,而无需运行'sbt compile'。我现在在我的应用程序的项目文件夹中添加了一个Generators.scala文件。然后我在build.sbt中添加了一个新任务(makeGamedata),它使用Generators类生成源代码。所以现在我的开发周期是:'sbt makeGamedata'>在'src/main/scala'上编写代码,使用生成的源代码''sbt compile'编译所有东西。这很好。现在我需要弄清楚如何在项目文件夹中对单元测试代码进行单元测试.. – reikje

回答

3

更新

如果我把你现在是正确的,你要能够seperately调用源产生。对于您可以简单地定义这样的地方在你的/build.sbt/project/Project.scala文件的自定义任务:

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

侧面说明:

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

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

则可以手动从SBT控制台这样调用发电机: 但是,如果您需要它们的唯一一件事是获得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 
+0

是的,但在你的例子中,你在A.scala存在之前写入对象B,如果没有适当的IDE支持和复杂的类,这将很难。我们也可以说代码生成依赖于一些可能会改变的XML文件,并且突然A没有名称属性了。那么你的编译将失败。 – reikje

+0

好的。现在我终于明白,你的问题是什么。查看我的更新。 –