如何将 Scala 宏作为项目分发?
How do I distribute a Scala macro as a project?
假设我有一个 Scala 编译时宏,我觉得它很有用并且想分享它(我愿意)。我如何创建一个 JAR 文件,当它加载到另一个项目时会在编译新项目时执行宏?
具体来说,我做了一个 StaticAnnotation
重写了它在编译之前包装的 class 的 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 控制台 class路径、Scala 脚本或另一个 Maven 项目(没有特殊的编译器插件)中,它只会 忽略 宏:AST 不会被覆盖,我的编译时 println
语句不会执行。如果我在我的宏上使用 @compileTimeOnly
注释(Scala 2.11 中的新功能),那么它会抱怨 @compileTimeOnly
错误消息。
我真的需要告诉我的用户在他们的 pom.xml
文件中添加编译器插件,以及 SBT 和其他构建工具的备用指令吗?其他包含宏的包 (MacWire, Log4s) 没有附带复杂的构建说明:他们只是说,"point to this dependency in Maven Central." 我在他们的构建过程中找不到使它起作用的魔力。我错过了什么?
如果您依赖于仅限宏天堂的功能,那么是的,您确实需要告诉您的用户添加编译器插件。请参阅 http://docs.scala-lang.org/overviews/macros/annotations.html。你说的项目只是使用了scala编译器内置的(非paradise)宏特性,没有使用宏注解。
假设我有一个 Scala 编译时宏,我觉得它很有用并且想分享它(我愿意)。我如何创建一个 JAR 文件,当它加载到另一个项目时会在编译新项目时执行宏?
具体来说,我做了一个 StaticAnnotation
重写了它在编译之前包装的 class 的 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 控制台 class路径、Scala 脚本或另一个 Maven 项目(没有特殊的编译器插件)中,它只会 忽略 宏:AST 不会被覆盖,我的编译时 println
语句不会执行。如果我在我的宏上使用 @compileTimeOnly
注释(Scala 2.11 中的新功能),那么它会抱怨 @compileTimeOnly
错误消息。
我真的需要告诉我的用户在他们的 pom.xml
文件中添加编译器插件,以及 SBT 和其他构建工具的备用指令吗?其他包含宏的包 (MacWire, Log4s) 没有附带复杂的构建说明:他们只是说,"point to this dependency in Maven Central." 我在他们的构建过程中找不到使它起作用的魔力。我错过了什么?
如果您依赖于仅限宏天堂的功能,那么是的,您确实需要告诉您的用户添加编译器插件。请参阅 http://docs.scala-lang.org/overviews/macros/annotations.html。你说的项目只是使用了scala编译器内置的(非paradise)宏特性,没有使用宏注解。