2014-05-08 19 views
16

ich eine Aufgabe in gradle definieren:Gradle Aufgabe sollte nicht automatisch ausgeführt werden,

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

Was ich nur ausgeführt werden soll, wenn ich es ausdrücklich als gradle releaseCandidate nennen. Wenn ich jedoch eine andere Aufgabe wie gradle assembleDebug ausführen, wird auch Task releaseCandidate ausgeführt. Ich möchte nicht, dass dieses Verhalten passiert. Es gibt keine Aufgabe abhängig von releaseCandidate oder umgekehrt.

Mein Projekt ist eine Android App, also verwende ich android Gradle Plugin.

Antwort

33

Ein häufiger Fehler. Fügen Sie der Task eine Aktion hinzu, andernfalls wird der Code in der Konfigurationsphase ausgeführt. Beispielaufgabe mit Aktion:

task sample << { 
} 

Wie ich Sie sehe eher eine benutzerdefinierte Aufgabe schreiben, müssen als Exec-Typen. Ich nehme an, es ist nicht zulässig, commandLine zweimal zu definieren.

+0

. Ich war mir der '' '' Verknüpfung bewusst, aber die Dokumentation machte dieses Verhalten in der Konfigurationsphase nicht klar. –

+0

Nun, ok. Wissen Sie, wie Sie es jetzt konfigurieren? Wenn nicht, zögern Sie nicht, weitere Fragen zu stellen. – Opal

+0

Ja, danke. :) –

10

Sie mischen Aufgabenkonfiguration und groovigen Code. Alles, was Teil des Hauptteils einer Taskdefinition ist, wird in der Konfigurationsphase ausgeführt. Die task task1 << { code } ist eine Abkürzung für


task task1 { 
    doLast { 
    code 
    } 
} 

commandLine ist Teil der Exec Task aber Ihre anderen Code ist nicht und sollte in eine dieser doLast gewickelt wird, um die Kommandozeile zuerst ausführen und dann zusätzlichen Code auszuführen. Wenn Sie eine andere exec commandLine benötigen, benötigen Sie eine andere Aufgabe.


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

Nur @Opal Antwort für den Fall abzuschließen, wenn Exec wirklich (zB Command Referenz) verwendet wird:

Gerade
task task1 << { 
    exec { 
     List<String> arguments = new ArrayList<String>() 
     //.. 
     commandLine arguments 
    } 
} 
Verwandte Themen