12

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

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

4

2 回答 2

18

我发现了一些(我相信是最近引入的)特性,它允许使用 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)
}

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

当然,同样可以使用groovy.transform.TypeChecked或任何其他注释来完成。

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

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

于 2015-05-18T15:20:18.143 回答
6

目前还没有,但这里有一个未解决的 Jira 问题,您可以关注此功能的进展情况

在 Groovy 开发人员列表上也有关于执行此操作的方法的讨论

于 2012-08-08T14:40:50.257 回答