7

我正在尝试使用 SBT(对我来说是全新的工具)生成一些样板文件。我使用无形的 sbt 文件作为任务的主要参考。我已经看到这个项目从头开始使用代码生成,但我的情况略有不同,因为我想从另一个类生成一些类。我假装使用新的 Scala 2.10.0-M4 反射功能来这样做。需要什么基本配置才能从 SBT 构建中获得反射?

到目前为止,sbt 无法找到scala.reflect.runtime.universe包,我不知道问题是来自新的 Scala jar 部门还是来自错误的配置。此外,我的 sbt about说:

[info] This is sbt 0.13.0-20120530-052139
[info] The current project is {file:/home/jlg/sandbox/abc/}abc
[info] The current project is built against Scala 2.10.0-SNAPSHOT
[info] 
[info] sbt, sbt plugins, and build definitions are using Scala 2.9.2

顺便问一下,有人知道使用 SBT 生成源代码的其他项目吗?

4

2 回答 2

3

当前的 SBT 版本基于 Scala 2.9,源代码生成与具有相同库的 SBT 一起运行。基本上有两种选择:

  • 非常前沿:让 SBT 版本在 Scala 2.10 上运行(甚至 0.13 分支都没有),或者等待它。最大的问题不仅在于您必须自己重新编译 SBT,还在于重新编译 Scala 2.10 所需的每一个 SBT 插件。从长远来看,这可能是满足您要求的最佳策略,但目前可能需要付出很多努力。但是,请注意,如果没有恶意技巧,就不能对编译的代码使用反射,因为代码生成应该在编译之前发生。如果您需要这样做,请考虑在程序内的编译时生成代码使用宏。这不包括 SBT 并且更加标准,但我不确定您是否可以在此版本中生成完整的类(我认为这是为未来计划的)。
  • 使用旧的:坚持使用 Scala 2.9 并使用 scalap 的功能 (ScalaSigParser) 进行编译时反射。问题是 API 是不同的(不确定有多深)并且没有真正支持公共使用,尽管很多人已经使用它很长时间了。对于我正在运行的一个项目,一位同事实施了方法,我将它集成到我的项目的 SBT 中(https://github.com/ps-mr/LinqOnSteroids/);最重要的是,我使用 Scalate 编写用于代码生成的模板,非常强大。特别参见build.sbt,它调用 project/Generator.scalaproject/src/main/scala/ivm/generation/ScalaSigHelpers.scala(一些非完全通用的包装器ScalaSigParser)。生成代码的缩放模板位于 src/main/resources,这里最相关的是src/main/resources/WrappedClassInlined.ssp。甚至涉及更多的东西,我担心你实际上需要结帐并使用它来看看它到底做了什么 - 但随时提出问题。

请注意,该代码受 BSD 许可证保护,因此如果您复制代码,您需要保留原始版权。

注意:所有链接(除了许可证)都指向当前的 HEAD 以保持稳定性,因此即使在将来的版本中移动/删除文件,它们也不会那么容易消失。

于 2012-07-27T01:14:04.793 回答
1

如果您使用的是 2.10.0-SNAPSHOT,那么您应该选择scala.reflect.runtime.universe. 查看http://dcsobral.blogspot.ch/2012/07/json-serialization-with-reflection-in.html了解更多信息。

于 2012-07-17T19:41:53.073 回答