如何在Gradle中获取下一个构建版本号

26

发布gradle存储库时,是否有任何方法可以获得下一个版本?

例如,如果我的存储库中有版本3.0.1,则我希望发布的版本是3.0.2

ivy有一个名为buildnumberant任务可以完美地完成这项工作:

<project xmlns:ivy="antlib:org.apache.ivy.ant"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<target name="ivyBuildNumber" description="Use ivy get the next build number">
    <ivy:buildnumber
        resolver="url-chain"
        organisation="${ivy.organisation}"
        module="${ivy.module}"
        revision="${version.base}"/>

    <echoproperties prefix="ivy.new."/>
</target>

有没有一种方法可以在gradle中这样做?如果没有,我怎么能从gradle的ant中访问ivy任务?

在我的build.gradle中,我调用了ant

ant.importBuild 'build.xml'

插件如何理解下一个版本应该是什么?在您的情况下,它可能是 3.0.23.1.0或者4.0.0。一些库可能有完全不同的版本控制标准,例如最新的 hibernate 版本是 5.2.12.Final - Sasha Shpota
@OleksandrShpota 的 Ant Ivy:buildnumber 任务做得非常好,可以看看这个链接:http://ant.apache.org/ivy/history/2.1.0/use/buildnumber.html - Ido Sorozon
也许您可以以不同的方式使用版本号。例如,如果我的版本是1.2.4,我的构建号可以是010204。我猜您可以编写自己的插件,默认情况下将1.2.4转换为1.2.5,010204转换为010205。我迄今为止还没有编写过Gradle插件,所以无法帮助您。 - TheKarlo95
5个回答

10

9

6

4

经过长时间的努力,我终于做到了。

在我的 build.gradle 文件中,我添加了以下代码:

ant.importBuild 'build.xml'

task getNextBuild(dependsOn : ivyBuildNumber) {
    doLast{
        def nextVersion = ant.properties['ivy.new.revision']
        println nextVersion
    }
}

我导入了我的 ant 构建文件,并创建了一个任务来调用 ivybuildnumber 任务。

这是我的 build.xml 文件。

<project xmlns:ivy="antlib:org.apache.ivy.ant">

    <target name="ivyBuildNumber">
        <path id="ivy.classpath" path="lib/ivy.jar" />
        <typedef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.classpath" />
        <ivy:buildnumber
            organisation="daniel"
            module="hello"/>
        <echoproperties prefix="ivy.new."/>
    </target>
</project>

因为我的IDE(Intellij)中没有ivy.jar,所以我从根目录(lib/ivy.jar)导入了ivy.jar


4
  • 对于这种情况,可以使用纯Gradle调用Ivy buildnumber任务,而无需导入Ant构建:
configurations {
    antTasks // define a new configuration
}

repositories {
    mavenCentral()
}

dependencies {
    antTasks("org.apache.ivy:ivy:2.4.0") // add Ivy library to it
}

ext {
    // define the Ivy task, using the extra configuration as classpath extension
    ant.taskdef(name: "ivyBuildNumber", 
                classname: "org.apache.ivy.ant.IvyBuildNumber", 
                classpath: configurations.antTasks.asPath) 

    ant.ivyBuildNumber(organisation: "daniel", module: "hello")
    nextVersion = ant.properties["ivy.new.revision"]
}

task demo {
    doLast {
        println nextVersion
    }
}
  • 一般而言,Gradle没有捆绑Maven Release Plugin等功能,因此必须依靠插件。其中一个可靠的插件是ResearchGate的gradle-release,另一个是Allegro Tech的axion。前者是经典的Maven风格版本控制,后者将SCM本身作为唯一真相来源,消除了构建文件中的版本控制。但是,这些插件都无法提供精确的所需行为。

  • 个人观点是最初使用了一些插件来解决版本控制问题。由于我在工作中使用Bamboo作为CI服务器,使用Gradle进行发布时几乎每件事情都会在CI服务器上崩溃。它可能运行了几周,但每次服务器更新都会带来一些问题。最终,我采用了不需要SCM的方法,并遵循了一个简单的约定:将分支名称用作基本版本,将其与构建编号连接起来(这两个值都由CI服务器提供):

ext {
    branch = System.getProperty("branch", "develop")
    buildNumber = System.getProperty("buildNumber", "latest")
    isRelease = System.getProperty("isRelease", "false").toBoolean()
    artifactVersion = "${branch}${(isRelease ? ".$buildNumber" : "-SNAPSHOT")}"
}

然后可以设置CI服务器来执行以下命令:

./gradlew -DisRelease=true -Dbranch=${git.branch} -DbuildNumber=${build.number} mavenPublish

当按下“发布”按钮时,例如3.0分支的第12次构建将在二进制存储库中生成版本3.0.12。
优点如下: + 版本号是免费的,只要分支名称相应命名即可 + 自动递增的构建编号也是免费的 + 可以轻松发布自定义修订版 + 没有插件意味着不会因Gradle版本更新而出现问题 + 这种方法非常简单,始终有效
缺点如下: - 标签需要额外的脚本任务 - 显然会跳过一些构建编号(例如,在3.5.76之后的下一个版本可能是3.5.84)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接