【问题标题】:How do I distribute a Scala macro as a project?如何将 Scala 宏作为项目分发?
【发布时间】: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 和其他构建工具的替代指令吗?其他包含宏的包(MacWireLog4s)没有附带复杂的构建指令:他们只是说,“指向 Maven Central 中的这个依赖项”。我在他们的构建过程中找不到使这项工作发挥作用的魔力。我错过了什么?

【问题讨论】:

    标签: scala maven macros sbt


    【解决方案1】:

    如果您仅依赖于宏天堂功能,那么是的,您确实需要告诉您的用户添加编译器插件。见http://docs.scala-lang.org/overviews/macros/annotations.html。您提到的项目仅使用scala编译器的内置(非天堂)宏功能,而不是宏注释。

    【讨论】:

      猜你喜欢
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      相关资源
      最近更新 更多