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

标签 java git gradle groovy versioning

我想通过Git标签在Gradle中实现Java项目的自动版本控制。目前,我正在使用git describe命令生成版本字符串。版本字符串必须在 list 文件中使用,并且也可以通过编程方式检索。这就是为什么我实现了一种方法,将其保存在构建文件中包含的属性文件中,并且可以被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文件中,因为它没有注意到文件已更改。所以我的应用程序显示了旧版本。

有什么我可以做的吗?如何获得通知以注意版本更改并使用当前version.properties文件创建一个jar?

最佳答案

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

jar {
  from versioning.versionFile
}

其次。您可以用类似的方式配置writeVersionFile。如果同时配置输入和输出,则任务将是可缓存的。 here可以看到它的变化方式,here可以找到一个演示。

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

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

关于java - Gradle中基于Git的自动版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43074676/

相关文章:

java - 如何用JUnit通过测试用例测试一个方法是否在另一个方法中执行?

java - 在java程序中执行winzip命令

ruby-on-rails - 将远程 heroku 存储库添加到我现有的本地存储库后无法推送到 heroku

git - 如何镜像和同步 GitHub 和 SourceForge 存储库?

android-studio - 命令行Gradle的UseSplitVerifier参数

grails - 在命令提示符中运行 “Task '时,Grails GGTS “grails war”汇编“在根项目中找不到”错误

java - 字段 'myField'的类型是具体类 'MyClass'

java - 如何将 hibernate 时间戳映射到 MySQL BIGINT?

git - 如何在 git merge 、修改、推送后修复 pull 请求?

android - 当我尝试运行该应用时会崩溃但没有错误? (Android Studio)