Gradle задача записать hg-версию в файл

Есть ли простой способ записать в файл меркурийную версию (или аналогичную внешнюю команду) в задачу gradle:

Я еще не знаком 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()
    }
}

Ответ 1

В этой сборке script есть две проблемы:

  • командная строка должна быть разделена; gradle пытается выполнить двоичный код с именем hg id -i -b t вместо hg с аргументами id, -i, -b и t
  • Требуется захват стандартного вывода; вы можете сделать это 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()
    }
}

Ответ 2

Здесь у меня немного другой подход, который использует javahg для пересмотра. И добавьте задачу "writeRevisionToFile"

Я написал краткую запись в своем блоге Gradle - Получить Hg Mercurial версию.

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()
}