【问题标题】:How to get the next build number in Gradle如何在 Gradle 中获取下一个内部版本号
【发布时间】:2018-05-02 15:30:57
【问题描述】:

在 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.04.0.0。一些库可能有完全不同的版本标准,例如最新的休眠版本是5.2.12.Final
  • @OleksandrShpota ant 的 ivy:buildnumber 任务在this 上做得很好
  • 也许如果您使用不同的内部版本号。例如,如果我的版本是 1.2.4,我的内部版本号可能是 010204。我想你可以编写自己的插件,默认情况下会执行 1.2.4 -> 1.2.5 和 010204 -> 010205。我还没有编写 Gradle到目前为止的插件,所以我无法为您提供帮助。

标签: java gradle ant ivy


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    是的,您可以通过将 ant 的 build.xml 文件导入 gradle 的 build.gradle 文件来从 ant 脚本访问 ivy 任务。以下是执行此操作的语法。

    ant.importBuild 'build.xml'

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        经过长时间的工作,我设法做到了。

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

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

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

        有我的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

        【讨论】:

          【解决方案5】:
          • 对于这种确切的行为,可以使用纯 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 发布插件等效的捆绑软件,因此必须依赖插件。一个可靠的插件是 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 分支的 build 12 将在二进制存储库中生成 3.0.12 版本。

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

          缺点是:
          - 标签需要额外的脚本任务
          - 一些内部版本号显然会被跳过(例如,3.5.76 之后的下一个版本可以是 3.5.84)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-07-31
            • 1970-01-01
            • 1970-01-01
            • 2014-11-15
            • 2014-10-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多