在编译之前从 Gradle 构建中修改 Groovy 源

Posted

技术标签:

【中文标题】在编译之前从 Gradle 构建中修改 Groovy 源【英文标题】:Modify Groovy sources from Gradle build before compiling 【发布时间】:2014-12-22 03:22:07 【问题描述】:

我有一个使用 Gradle 构建的 Groovy 应用程序。像往常一样,我在build.gradle 脚本中定义了应用程序版本号/字符串。

现在我想在 Groovy 应用程序中使用该版本字符串,作为硬编码的静态信息。例如作为主应用程序类中的final static 成员:

class MyApp 
    final static APP_VERSION = "0.1"

由于版本信息来自build.gradle 脚本,上述Groovy 类成员需要在编译源代码之前由Gradle 设置。

换句话说:我需要一个 Gradle 任务,它允许我在 Groovy 源代码中设置变量的值,然后再由 Gradle 构建它们。我可以通过正则表达式搜索该值并在 Groovy 源文件中替换它,但这感觉有点笨拙。

任何“最佳实践”想法如何实现?

【问题讨论】:

该类是否包含除版本之外的任何内容?是否有某些原因您不能从属性文件中写入读取它? @DylanBijnagte:我想对版本进行硬编码,但不想在运行时从文件中读取它。是的,该类确实包含此版本属性之外的其他代码。 如果文件很小,我会说它是模板,否则我认为您可能会被正则表达式解决方案卡住。 如何创建一个仅包含此值的 MyAppVersion 类文件。 MyApp 引用 MyAppVersion 但您在编译之前将 MyAppVersion 替换为 Gradle 构建。那么就不需要正则表达式了。 @ToddWCrone:嗯...我想这是一个不错的方法,谢谢。 【参考方案1】:

我不能给你最终的解决方案,但是,我认为,你应该看看AST Transformations

另一种选择,如果您将应用程序打包到 jar/war 中, - 您可以从清单文件中获取应用程序的版本(但如果您从 IDE 启动应用程序,它将不起作用)

final static versin = MyApp.class.getPackage().getSpecificationVersion()

【讨论】:

好吧,使用 AST 可能会奏效。但是对于这个简单的任务,感觉有点矫枉过正,不是吗? 我必须同意。对此的 AST 转换就像用火焰喷射器点燃香烟。

以上是关于在编译之前从 Gradle 构建中修改 Groovy 源的主要内容,如果未能解决你的问题,请参考以下文章

在android gradle构建之前执行任务?

如何在Kotlin中使用Gradle构建缓存?

从Gradle生命周期到自定义Task挂接到Build构建流程全解

从Gradle生命周期到自定义Task挂接到Build构建流程全解

Android编译gradle 动态修改版本号

CocosCreator-对Android构建后,编译apk前,部分修改