【发布时间】:2012-08-08 14:37:14
【问题描述】:
我知道从 Groovy 2.0 开始就有了静态编译的注解。 但是,很容易意外地忽略此类注释,但仍然会遇到麻烦。
有什么方法可以实现相反的编译器行为,例如默认编译所有项目文件的静态文件,并使用某种@CompileDynamic 注解仅编译动态选择的文件?
【问题讨论】:
标签: groovy static compilation
我知道从 Groovy 2.0 开始就有了静态编译的注解。 但是,很容易意外地忽略此类注释,但仍然会遇到麻烦。
有什么方法可以实现相反的编译器行为,例如默认编译所有项目文件的静态文件,并使用某种@CompileDynamic 注解仅编译动态选择的文件?
【问题讨论】:
标签: groovy static compilation
我发现了一些(我相信是最近引入的)功能,允许使用 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 用作构建工具时,我不确定如何实现相同的效果。不过,我将来可能会使用此类信息更新此答案。
【讨论】:
--configscript 开关所提到的at Groovy docs。我找不到描述脚本本身语法的文档。
CompilerCustomizationBuilder找到。
目前没有,但您可以关注 open Jira issue here 以查看此功能的进展
还有一个关于这样做的方法的讨论on the Groovy developers list
【讨论】: