scala - 如何将Scala宏作为项目分发?

标签 scala maven macros sbt

假设我有一个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中的这种依赖关系”。在他们的构建过程中,我找不到使之起作用的魔力。我想念什么?

最佳答案

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

关于scala - 如何将Scala宏作为项目分发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31236360/

相关文章:

java - Eclipse 在多个项目上运行不同的 Maven 目标

scala - Spark 中的流式查询未显示任何进度

scala - 如何使用 Scala 的 MurmurHash 实现 : scala. util.MurmurHash3?

java - 根据 DataStax Enterprise 的运行时类路径构建 Spark 应用程序

objective-c - Xcode自定义 header 模板: ___DATE___ format

c - 函数中的宏行为

使用可变参数和后期扩展创建字符串化宏参数列表

scala - 替换不推荐使用的<:< Manifest type witness in Scala 2. 10

maven - 我如何将不同的原型(prototype)链接在一起?

java - 在 spring 工具套件中找不到丢失的 com.css maven Artifact