假设我有一个Scala编译时宏,我觉得它有用,并且想共享它(我愿意)。如何创建一个JAR文件,当将其加载到另一个项目中时,将在编译新项目时执行该宏?
具体来说,我编写了一个StaticAnnotation
来重写它在编译之前包装的类的AST。这在我的Maven构建中有效(宏在main
目录中定义,在test
目录中的测试用例上运行),因为我有
<compilerPlugins>
<compilerPlugin>
<groupId>org.scalamacros</groupId>
<artifactId>paradise_2.10.5</artifactId>
<version>2.1.0-M5</version>
</compilerPlugin>
</compilerPlugins>
在我的
scala-maven-plugin
中。 (我从一个Scala 2.10项目开始,如果可行,将同时提供2.10和2.11。)但是,如果我将生成的JAR放在Scala控制台类路径上,Scala脚本中或另一个Maven项目中(没有特殊的编译器插件),它只会忽略宏:AST不会被覆盖,而我的编译时
println
语句不会不执行。如果我在宏上使用了@compileTimeOnly
批注(Scala 2.11中的新增功能),则它会提示@compileTimeOnly
错误消息。我真的需要告诉用户在其
pom.xml
文件中添加编译器插件,以及SBT和其他构建工具的替代说明吗?其他包含宏的软件包(MacWire,Log4s)没有复杂的构建说明:它们只是说“指向Maven Central中的这种依赖关系”。在他们的构建过程中,我找不到使之起作用的魔力。我想念什么?
最佳答案
如果您依赖于仅用于宏天堂的功能,则可以,您确实需要告诉用户添加编译器插件。参见http://docs.scala-lang.org/overviews/macros/annotations.html。您提到的项目仅使用scala编译器的内置(非天堂)宏功能,而不使用宏注释。
关于scala - 如何将Scala宏作为项目分发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31236360/