如何将 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)宏特性,没有使用宏注解。