是否有Groovy静态编译的全局标志?

top*_*opr 12 groovy static compilation

我知道,因为Groovy 2.0有静态编译的注释.然而,偶然省略这样的注释并且仍然遇到麻烦很容易.

是否有任何方法可以实现相反的编译器行为,例如默认情况下编译静态所有项目文件,并编译仅用于某种​​类型@CompileDynamic注释的目的选择的动态文件?

top*_*opr 16

我发现了一些(我相信最近推出的)功能,它允许使用Gradle.

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

compileGroovy {
    configure(groovyOptions) {
        configurationScript = file("$rootDir/config/groovy/compiler-config.groovy")
    }
}
Run Code Online (Sandbox Code Playgroud)

或者compileTestGroovy { ...将其应用于测试源.请记住,静态编译和类型检查都不适用于Spock Framework.Spock的性质充分利用了动态的'groovyness'.

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

import groovy.transform.CompileStatic

withConfig(configuration) {
    ast(CompileStatic)
}
Run Code Online (Sandbox Code Playgroud)

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

当然,可以使用相同groovy.transform.TypeChecked或任何其他注释来完成相同的操作.

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

当没有使用Gradle作为构建工具时,我不确定如何实现相同目的.我可能会在将来用这样的信息更新这个答案.

  • 嘿,这是在Groovy的文档中写的吗?你能提供这个解决方案的来源吗? (2认同)

tim*_*tes 6

不是在这个时候,但是在这里有一个开放的Jira问题,您可以关注此功能的进度

还讨论了在Groovy开发人员列表中执行此操作的方法

  • 正如@topr所提到的,现在这是groovy 2.1+中的一个功能,为未来的访问者更新答案可能会更好. (2认同)