【发布时间】:2015-09-23 00:57:24
【问题描述】:
假设我有一个 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 中的这个依赖项”。我在他们的构建过程中找不到使这项工作发挥作用的魔力。我错过了什么?
【问题讨论】: