0

我目前正在将一个项目从 ant 迁移到 gradle。一切都很好,只存在一个问题:目前我们有一个基于 ant-contrib 的自定义任务,用于在 repo 上执行 git 命令以读取最新的 xy-release 标签以获取版本号(以及生成的 jar 文件名,如 project- xy.jar)。正如我所看到的,我需要一些插件。可悲的是,通过可用的插件,没有什么能真正帮助我(存在一些与 git 相关的插件,但他们的目标是别的,比如发布,所以标记 repo,而不是阅读已经制作的标签)所以我需要帮助来实现我的目标。我必须在 Gradle 中发明整个东西吗?我知道我可以导入现有的 ant 构建文件,但我真的不想这样做。

4

3 回答 3

2

好的,我尝试在 Gradle 中实现相同的旧东西。(因为我正在逃离蚂蚁/常春藤,所以我不想保留旧东西)。这是输出(可能很蹩脚,因为我是 Gradle 和 Groovy 的新手)。有用。

jar {
    dependsOn configurations.runtime

    // get the version
    doFirst {
        new ByteArrayOutputStream().withStream { execOS ->
            def result = exec {
                executable = 'git'
                args = [ 'describe', '--tags', '--match', '[0-9]*-release', '--dirty=-dirty' ]
                standardOutput = execOS
            }

            // calculate version information
            def buildVersion = execOS.toString().trim().replaceAll("-release", "")
            def buildVersionMajor = buildVersion.replaceAll("^(\\d+).*\$", "\$1")
            def buildVersionMinor = buildVersion.replaceAll("^\\d+\\.(\\d+).*\$", "\$1")
            def buildVersionRev = buildVersion.replaceAll("^\\d+\\.\\d+\\.(\\d+).*\$", "\$1")
            def buildTag = buildVersion.replaceAll("^[^-]*-(.*)\$", "\$1").replaceAll("^(.*)-dirty\$", "\$1")
            def dirty = buildVersion.endsWith("dirty")

            println("Version: " + buildVersion)
            println("Major: " + buildVersionMajor)
            println("Minor: " + buildVersionMinor)
            println("Revision: " + buildVersionRev)
            println("Tag: " + buildTag)
            println("Dirty: " + dirty)

            // name the jar file
            version buildVersion
        }
    }

    // include dependencies into jar
    def classpath  = configurations.runtime.collect { it.directory ? it : zipTree(it) }
    from (classpath) {
        exclude 'META-INF/**'
    }

    // manifest definition
    manifest {
        attributes(
            'Main-Class': 'your.fancy.MainClass'
        )
    }
}
于 2012-09-27T13:06:35.593 回答
1

或者,只需重用现有的 Ant 任务。无需导入 Ant 构建。

于 2012-09-26T15:20:36.460 回答
0

由于 git 对此有命令git describe,所以它应该很简单。只需调用 git 并读取输出。要获取最后一个 *-release 标签,确切的命令是

git describe --abbrev=0 --match=*-release

(我不确定它是正则表达式还是全局;如果是正则表达式,则需要.*-release)。--tags如果您的发布标签没有注释,请添加。

于 2012-09-26T14:18:11.890 回答