我知道从 Groovy 2.0 开始就有了静态编译的注解。但是,很容易意外地忽略此类注释,但仍然会遇到麻烦。
有什么方法可以实现相反的编译器行为,例如默认编译静态所有项目文件,并使用某种 @CompileDynamic 注释编译仅动态选择的文件?
我知道从 Groovy 2.0 开始就有了静态编译的注解。但是,很容易意外地忽略此类注释,但仍然会遇到麻烦。
有什么方法可以实现相反的编译器行为,例如默认编译静态所有项目文件,并使用某种 @CompileDynamic 注释编译仅动态选择的文件?
我发现了一些(我相信是最近引入的)特性,它允许使用 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 用作构建工具时,我不确定如何实现相同的目标。不过,我将来可能会使用此类信息更新此答案。
目前还没有,但这里有一个未解决的 Jira 问题,您可以关注此功能的进展情况
在 Groovy 开发人员列表上也有关于执行此操作的方法的讨论