Question

I'm defining a task in gradle:

task releaseCandidate(type: Exec) {
    commandLine 'git', 'checkout', 'develop'

    // Increment version code in Manifest
    String manifest = new File('AndroidManifest.xml').getText('UTF-8')
    Pattern pattern = Pattern.compile('android:versionCode="([0-9]+)"')
    Matcher matcher = pattern.matcher(manifest)
    matcher.find()
    int newVersionCode = Integer.parseInt(matcher.group(1)) + 1
    manifest = manifest.replaceAll(
        "android:versionCode=\"([0-9]+)\"", "android:versionCode=\"$newVersionCode\""
    )
    new File('AndroidManifest.xml').write(manifest, 'UTF-8')

    commandLine 'git', 'diff'
}

Which I want to execute only when I explicitly call it as gradle releaseCandidate. However, when I run any other task, such as gradle assembleDebug, it also runs task releaseCandidate. I don't want that behaviour to happen. There is no task depending on releaseCandidate or vice-versa.

My project is an Android app, so I am using android gradle plugin.

Was it helpful?

Solution

A common pitfall. Add an action to the task otherwise code will run at configuration phase. Sample task with action:

task sample << {
}

As I see You'd rather need to write a custom task than using Exec type. I suppose it's not valid to define commandLine twice.

EDIT

You can read this post to get the general idea how it all works.

OTHER TIPS

You are mixing Task configuration and groovy code. Everything that is part of the main body of a task definition will be executed in the configuration phase. The task task1 << { code } is a shorthand for


task task1 {
  doLast {
    code
  }
}

commandLine is part of the Exec Task but your other code is not and should be wrapped into a doLast this will execute the commandline first and then execute your additional code. If you need another exec commandLine then you'll need another task.


task releaseCandidate(type: Exec) {
    commandLine 'git', 'checkout', 'develop'

    doLast {
    // Increment version code in Manifest
    String manifest = new File('AndroidManifest.xml').getText('UTF-8')
    Pattern pattern = Pattern.compile('android:versionCode="([0-9]+)"')
    Matcher matcher = pattern.matcher(manifest)
    matcher.find()
    int newVersionCode = Integer.parseInt(matcher.group(1)) + 1
    manifest = manifest.replaceAll(
        "android:versionCode=\"([0-9]+)\"", "android:versionCode=\"$newVersionCode\""
    )
    new File('AndroidManifest.xml').write(manifest, 'UTF-8')
    }
}

Just to complete @Opal answer for cases when Exec is really used (for example CommandLine reference) :

task task1 << {
   exec {
        List<String> arguments = new ArrayList<String>()
        //..
        commandLine arguments
   }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top