2016-07-13 7 views
1

Ich brauche eine Aufgabe, was am Ende laufen wird. Sagen wir etwas println. Ich habe mehrere Beispiele gesehen, wie man eine Aufgabe am Ende ausführt, und sie hängen immer von anderen Aufgaben ab, also bekomme ich nicht wirklich, wie es geht, und ich habe keine Aufgaben. Denn jetzt habe ich einige Stück Code:Aufgabe einmal am Ende in Gradle ausführen

if (releaseBol) 
{ 
// Some of my code 
// Run twice, one for lab and other for prod 
println fileName 
} 

Das Stück Code laufen zweimal, einmal für Labor Geschmack und eine für prod Geschmack falls ich laufen:

MyApp:assembleRelease -PRELEASE=1 

Ich brauche diesen Frieden Code nur einmal laufen, dafür muss ich es einmal am Ende laufen.

Meine volle gradle:

import org.tmatesoft.svn.core.wc.* 

apply plugin: 'com.android.application' 

def BuildNumberFile = new File('./BuildNumber.txt') 
def BuildNumber = 'BRND' 
def _versionName = '1.0.1' 
def _applicationId = 'com.myapp.android.pic' 
def _versionCode = 17 
def fileName = '' 
def obfuscated = false 
def releaseBol = false 


android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.2" 
    lintOptions { 
     abortOnError false 
    } 

    def lines = BuildNumberFile.readLines() 
    BuildNumber = 'S'+lines.get(0) 

    defaultConfig { 
     applicationId _applicationId 
     minSdkVersion 15 
     targetSdkVersion 23 
     versionCode _versionCode 
     versionName _versionName 
     multiDexEnabled true 
     resValue 'string', 'BUILD_NUMBER_RES', BuildNumber 


    } 

    if (project.hasProperty('RELEASE') && project.ext.RELEASE == '1') 
     releaseBol = true 

    applicationVariants.all { variant -> 
     variant.outputs.each { output -> 
      output.outputFile = new File(
        output.outputFile.parent, 
        output.outputFile.name.replace(".apk", "-${variant.versionName}." + BuildNumber + "-" + getSvnRevision() + ".apk")) 
      fileName=output.outputFile.name 

     } 


     variant.assemble.doLast { 
      variant.outputs.each { output -> 
       println "aligned " + output.outputFile 
       println "unaligned " + output.packageApplication.outputFile 

       File unaligned = output.packageApplication.outputFile; 
       File aligned = output.outputFile 
       if (!unaligned.getName().equalsIgnoreCase(aligned.getName())) { 
        println "deleting " + unaligned.getName() 
        unaligned.delete() 
       } 

      } 

      if (releaseBol) { 

       // Some of my code 
       // Run twice, one for lab and other for prod 
       println fileName 
      } 
     } 
    } 
    signingConfigs { 
     release { 
      storeFile file('myapp') 
      storePassword "myapp123" 
      keyAlias 'myapp' 
      keyPassword "myappmobile" 
     } 
    } 

    productFlavors { 
     prod { 


     } 

     lab { 

     } 

    } 

    buildTypes { 
     release { 
      minifyEnabled obfuscated 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-android.txt' 
      signingConfig signingConfigs.release 
     } 


    } 


    dexOptions { 
     preDexLibraries = false 
     javaMaxHeapSize "4g" 
     jumboMode true 
    } 

    packagingOptions { 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE.txt' 
     exclude 'META-INF/DEPENDENCIES' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/LICENSE' 
    } 

} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile project(':trunk') 
} 

Es hilft mir nur, wenn Sie einige println zu diesem gradle hinzufügen können, die am Ende laufen einmal wird.

Antwort

2

Sie müssen eine Instanz BuildListener hinzuzufügen:

class BA extends BuildAdapter { 
    void buildFinished(BuildResult result) { 
     println "finished" 
    } 
} 

gradle.addListener(new BA()) 

EDIT

Wenn es um releaseBol kann auf folgende Weise erfolgen:

project.ext.releaseBol = false 

class BA extends BuildAdapter { 

    Project project 

    BA(Project project) { 
     this.project = project 
    } 

    void buildFinished(BuildResult result) { 
     println "finished $project.releaseBol" 
    } 
} 

gradle.addListener(new BA(project)) 

EDIT 2

Sie können auch die TaskExecutionGraph von Gradle verwenden. Mit whenReady Schließung können Sie Informationen erhalten, dass das Diagramm bereit und mit Aufgaben gefüllt ist. Zu diesem Zeitpunkt gibt es keine Option, das Diagramm zu ändern (Aufgabe hinzufügen/entfernen, Reihenfolge ändern), aber Sie können (über getAllTasks) die letzte abrufen und ... eine Aktion hinzufügen. Hier ist, wie es aussieht:

task someTask << { 
    println "run" 
} 

gradle.taskGraph.whenReady { 
    gradle.taskGraph.allTasks[-1] << { 
    println 'finished' 
    } 
} 
+0

Danke, es ist das, was ich gefragt ... aber ich muss in der Funktion BA stellen, wenn (releaseBol) {} und releaseBol wird dort nicht erreicht. Ich sehe BA läuft nach "BUILD ERFOLGREICH", aber ich brauche es vor – Dim

+0

@Dim, können Sie 'releaseBol' im Projektbereich definieren und dann verweisen Sie über' Projekt' Variable. Ich schätze, es ist unmöglich, es ohne BUILD SUCCESSFUL auszuführen, ohne einen Task Finalizer zu verwenden. – Opal

+0

@Dim, siehe die Bearbeitung - die letzte ist wahrscheinlich das, wonach Sie suchen. – Opal