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

时间:2017-03-28 16:12:22

标签: java git gradle groovy versioning

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

我现在拥有的是这个小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?

1 个答案:

答案 0 :(得分:0)

您需要做的是为TaskOutputs任务配置from(或Jar),以便它可以识别某些内容是否已更改并在不调用{{1}的情况下运行明确地。这可以通过以下方式完成:

clean

其次。您可以以类似的方式配置jar { from versioning.versionFile } 。如果配置输入和输出,则任务将可缓存。可以看到它如何变化here,可以找到一个演示here

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

您还可以在versionFile文件中配置jar输入。