La tarea de Gradle no debería ejecutarse automáticamente

Estoy definiendo una tarea en 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' } 

Lo cual quiero ejecutar solo cuando lo llamo explícitamente como gradle releaseCandidate . Sin embargo, cuando ejecuto cualquier otra tarea, como gradle assembleDebug , también ejecuta la tarea releaseCandidate. No quiero que ese comportamiento suceda. No hay ninguna tarea que dependa de ReleaseCandidate o viceversa.

Mi proyecto es una aplicación de Android, así que estoy usando el complemento Gradle de android .

Una trampa común. Agregue una acción a la tarea; de lo contrario, el código se ejecutará en la fase de configuración. Muestra de tarea con acción:

 task sample << { } 

Como veo, prefieres escribir una tarea personalizada que usar el tipo Exec . Supongo que no es válido definir commandLine dos veces.

Está mezclando la configuración de tareas y el código groovy. Todo lo que es parte del cuerpo principal de una definición de tarea se ejecutará en la fase de configuración. La task task1 << { code } es una abreviatura de

 task task1 { doLast { code } } 

commandLine es parte de la tarea Exec pero su otro código no está y debe estar doLast en un doLast Esto ejecutará primero la línea de comando y luego ejecutará su código adicional. Si necesita otra línea de commandLine exec, necesitará otra tarea.

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

Solo para completar la respuesta de @Opal para los casos en los que se usa realmente Exec (por ejemplo, referencia de CommandLine ):

 task task1 << { exec { List arguments = new ArrayList() //.. commandLine arguments } }