11

有没有一种简单的方法可以在 gradle 任务中写入 mercurial 版本(或类似的外部命令):

我还不熟悉 groovy/gradle,但我目前的努力看起来像这样:

task versionInfo(type:Exec){
    commandLine 'hg id -i -b -t'
    ext.versionfile = new File('bin/$baseName-buildinfo.properties')

    doLast {
        versionfile.text = 'build.revision=' + standardOutput.toString()
    }
}
4

2 回答 2

14

这个构建脚本有两个问题:

  1. 命令行需要拆分;gradle 试图执行一个名为而hg id -i -b t不是hg带参数的二进制文件id-i-bt
  2. 需要捕获标准输出;你可以让它ByteOutputStream稍后阅读

试试这个:

task versionInfo(type:Exec){
    commandLine 'hg id -i -b -t'.split()
    ext.versionfile = new File('bin/$baseName-buildinfo.properties')
    standardOutput = new ByteArrayOutputStream()

    doLast {
        versionfile.text = 'build.revision=' + standardOutput.toString()
    }
}
于 2012-12-17T20:29:13.547 回答
3

这里我有一点不同的方法,它使用 javahg 来获得修订。并添加任务“writeRevisionToFile”

我在我的博客Gradle - Get Hg Mercurial revision上写了简短的帖子。

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.aragost.javahg:javahg:0.4'
    }
}

task writeRevisionToFile << {
    new File(projectDir, "file-with-revision.txt").text = scmRevision
}


import com.aragost.javahg.Changeset
import com.aragost.javahg.Repository
import com.aragost.javahg.commands.ParentsCommand

String getHgRevision() {
    def repo = Repository.open(projectDir)
    def parentsCommand = new ParentsCommand(repo)
    List<Changeset> changesets = parentsCommand.execute()
    if (changesets == null || changesets.size() != 1) {
        def message = "Exactly one was parent expected. " + changesets
        throw new Exception(message)
    }
    return changesets[0].node
}

ext {
    scmRevision = getHgRevision()
}
于 2015-10-19T11:53:50.090 回答