如何在Gradle中获取下一个内部版本号

时间:2017-11-19 07:32:55

标签: java gradle ant ivy

在Gradle中发布到存储库时,有没有办法获得下一个版本?

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

ivy有一个名为buildnumber ant的任务,其确实完成了这一任务:

<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的ivy访问ant个任务?

build.gradle我呼叫ant

ant.importBuild 'build.xml'

5 个答案:

答案 0 :(得分:10)

我不认为Gradle中有支持,但您可以尝试使用Ant任务。 https://docs.gradle.org/current/userguide/ant.html#sec:import_ant_build

另一种方法是使用某种插件或自定义任务来管理版本。

答案 1 :(得分:8)

是的,您可以通过将ant的build.xml文件导入gradle的build.gradle文件,从ant脚本访问常春藤任务。以下是这样做的语法。

ant.importBuild'build.xml'

请参阅:https://docs.gradle.org/current/userguide/ant.html#sec:import_ant_build

答案 2 :(得分:6)

我建议您使用ResearchGate发布插件 https://github.com/researchgate/gradle-release 它有一个漂亮的文档。易于阅读。 另外,看看我在个人项目中如何使用它。 https://github.com/vatolinrp/bitcoin-esb/blob/master/build.gradle 这对你来说是一个很好的例子。

答案 3 :(得分:5)

经过长时间的努力,我设法做到了。

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

python3 script.py

我导入了npm install jquery构建文件,并创建了一个调用ant.importBuild 'build.xml' task getNextBuild(dependsOn : ivyBuildNumber) { doLast{ def nextVersion = ant.properties['ivy.new.revision'] println nextVersion } } buildnumber任务的任务。

我的 build.xml

ant

因为我的IDE(Intellij),内容中没有ivy,所以 我从根目录(<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>

导入了ivy.jar

答案 4 :(得分:2)

  • 对于这种确切的行为,可以使用纯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

什么时候发布&#39;按钮被按下。例如,3.0分支的build 12将在二进制存储库中生成3.0.12版。

优点是:
+版本免费提供,假设分支机构相应命名为
+自动递增的内部版本号也免费提供 +一个人可以轻松发布自定义修订版 +没有插件意味着Gradle版本更新没有问题 +这种方法很简单,总是有效

缺点是:
- 没有标签(在SCM中根本没有变化 - 没有发布分支等),但由于内部版本号始终是已知的,因此可以查看CI构建历史中的修订版
- 显然会跳过一些构建号码(例如3.5.76之后的下一个版本可以是3.5.84)