- 对于这种情况,可以使用纯Gradle调用Ivy
buildnumber
任务,而无需导入Ant构建:
configurations {
antTasks
}
repositories {
mavenCentral()
}
dependencies {
antTasks("org.apache.ivy:ivy:2.4.0")
}
ext {
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)
3.0.2
、3.1.0
或者4.0.0
。一些库可能有完全不同的版本控制标准,例如最新的 hibernate 版本是5.2.12.Final
。 - Sasha Shpota