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