【问题标题】:Is there any global flag for Groovy static compilation?Groovy 静态编译是否有任何全局标志?
【发布时间】:2012-08-08 14:37:14
【问题描述】:

我知道从 Groovy 2.0 开始就有了静态编译的注解。 但是,很容易意外地忽略此类注释,但仍然会遇到麻烦。

有什么方法可以实现相反的编译器行为,例如默认编译所有项目文件的静态文件,并使用某种@CompileDynamic 注解仅编译动态选择的文件?

【问题讨论】:

    标签: groovy static compilation


    【解决方案1】:

    我发现了一些(我相信是最近引入的)功能,允许使用 Gradle 这样做。

    在包含 groovy 源的项目的 build.gradle 文件中,我们需要添加以下行:

    compileGroovy {
        configure(groovyOptions) {
            configurationScript = file("$rootDir/config/groovy/compiler-config.groovy")
        }
    }
    

    compileTestGroovy { ... 将其应用于测试源。请记住,静态编译和类型检查都不适用于 Spock 框架。 Spock 本质上经常使用动态的“groovyness”。

    然后在项目的根目录下创建文件夹config/groovy/和一个名为compiler-config.groovy的文件。文件内容如下:

    import groovy.transform.CompileStatic
    
    withConfig(configuration) {
        ast(CompileStatic)
    }
    

    显然 configurationScript 的路径和名称可能会有所不同,这取决于您。它不应该转到相同的 src/main/groovy,因为它会混合完全不同的关注点。

    当然,groovy.transform.TypeChecked 或任何其他注释也可以这样做。

    要在某些类或方法上反转应用行为,则可以分别使用 @CompileDynamic 注释或 @TypeChecked(TypeCheckingMode.SKIP)

    当没有 Gradle 用作构建工具时,我不确定如何实现相同的效果。不过,我将来可能会使用此类信息更新此答案。

    【讨论】:

    • 嘿,这是写在 Groovy 文档中的某处吗?你能提供这个解决方案的来源吗?
    • 我同意@ThanosFisherman - 我没有看到有关此功能的文档或解释。我查看了代码,它似乎指向运行配置的this block
    • @ThanosFisherman 我认为这是--configscript 开关所提到的at Groovy docs。我找不到描述脚本本身语法的文档。
    • 多看了一下,我觉得编译器配置的源码可以在CompilerCustomizationBuilder找到。
    【解决方案2】:

    目前没有,但您可以关注 open Jira issue here 以查看此功能的进展

    还有一个关于这样做的方法的讨论on the Groovy developers list

    【讨论】:

    • 谢谢,我刚刚对 JIRA 问题投了赞成票,现在正在关注它。
    • 正如@topr 提到的,这现在是 groovy 2.1+ 中的一个功能,为未来的访问者更新答案可能会很好。
    • Coo,谢谢你的信息。一旦我有时间制作如何使用此功能的示例,我将立即更新答案。欢迎任何人在此之前发帖。
    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 2018-03-21
    • 2019-03-11
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多