Git 基于 Gradle 中的自动版本控制

Git based automatic versioning in Gradle

我想通过 Git 标签为 Gradle 中的 java 项目实现自动版本控制。目前我正在使用 git describe 命令生成版本字符串。版本字符串必须在清单文件中使用,并且还可以通过编程方式检索。这就是为什么我实施了一种方法将其保存在构建中包含的属性文件中,并且可以通过 Java 代码读取。

我目前拥有的是这个小 Gradle 插件(我真的是 gradle 的新手):

apply plugin: 'java'
apply plugin: VersioningPlugin

class VersioningPlugin implements Plugin<Project> {

    private Project project;

    private String getVersion() {
        def stdout = new ByteArrayOutputStream()
        project.exec {
            commandLine 'git', 'describe', '--tags'
            standardOutput = stdout
        }
        stdout.toString().trim()
    }

    @Override
    void apply(Project project) {
        this.project = project

        project.extensions.create('versioning', VersioningPluginExtension)

        project.versioning.version = getVersion()

        project.task('writeVersionFile') {
            doLast {
                def versionPropsFile = project.versioning.versionFile
                def versionProps = new Properties()
                versionProps.put('version', getVersion())
                versionProps.store(versionPropsFile.newWriter(), null)
            }
        }
    }
}

class VersioningPluginExtension {
    File versionFile
    String version
}

compileJava.dependsOn writeVersionFile

我在构建脚本中使用它是这样的:

apply from: 'versioning.gradle'
versioning {
  versionFile = file('my/ressource/folder/version.properties')
}
println(versioning.version)

一切正常。我遇到的唯一问题如下:我使用 gradle 来构建和测试我的代码,然后提交代码并创建一个 git 标记。如果我现在要求 gradle 打包一个 jar 文件而不先清理,它不会将新的 version.properties 复制到 jar 文件中,因为它没有注意到文件发生了变化。所以我的应用程序显示旧版本。

我能做些什么吗?如何让 gradle 注意到版本更改并使用当前 version.properties 文件创建一个 jar?

您需要做的是为 Jar 任务配置一个 TaskOutputs(或 from),以便它可以识别是否发生了某些变化并 运行无需显式调用 clean。这可以通过以下方式完成:

jar {
  from versioning.versionFile
}

其次。您可以用类似的方式配置 writeVersionFile。如果您同时配置输入和输出,任务将 可缓​​存 。可以看到它是如何变化的 here, a demo can be found here.

此外,请注意您的任务现在是在 afterEvaluate 闭包中创建的。这是为什么?因为这是在执行 versioning {} 扩展并设置 versionFile 属性 之后,可以配置为输出。

您还可以在 versioning.gradle 文件中配置 jar 输入。