it-swarm.com.de

Führen Sie die Aufgabe vor dem Kompilieren mit dem Gradle-Plugin Android aus

Ich habe eine sehr einfache build.gradle - Datei mit folgendem Inhalt:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.Android.tools.build:gradle:0.4.1'
    }
}

apply plugin: 'Android'

Android {
    buildToolsVersion "17.0.0"
    compileSdkVersion 17

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
}

task generateSources {
    doFirst {
        def script = "python GenerateSources.py".execute()
        script.in.eachLine {line -> println line}
        script.err.eachLine {line -> println "ERROR: " + line}
        script.waitFor()
    }
}

Ich möchte, dass die Task generateSources ausgeführt wird, bevor die Java - Kompilierung gestartet wird. Ich habe mehrere Lösungen gefunden, wie man das macht, wie compileJava.dependsOn("generateSources"), aber leider geben sie einen Fehler aus:

A problem occurred evaluating root project 'Android'.
> Could not find property 'compileJava' on root project 'Android'.

Ich kenne Gradle nicht und kann nicht verstehen, was an diesem Code falsch ist. Ich würde gerne wissen, wie ich diesen Fehler beheben kann.

35
Michael

Der richtige Weg, um eine Aufgabe auszuführen, bevor Java compilation on Android)), besteht darin, eine Kompilierungsaufgabe für jede Variante von Ihrer Aufgabe abhängig zu machen.

afterEvaluate {
  Android.applicationVariants.all { variant ->
    variant.javaCompiler.dependsOn(generateSources)
  }
}
24
Michael

Anscheinend fügt das Plugin Android keine Aufgabe compileJava hinzu (wie es das Plugin Java tun würde). Sie können mit gradle tasks --all Prüfen, welche Aufgaben verfügbar sind, und die richtige für Ihre (ansonsten korrekte) Abhängigkeitsdeklaration auswählen.

BEARBEITEN:

Offensichtlich verzögert das Plugin Android die Erstellung von Aufgaben so, dass nicht wie üblich eifrig auf sie zugegriffen werden kann. Eine Möglichkeit, dieses Problem zu beheben, besteht darin, den Zugriff auf das Ende der Konfigurationsphase zu verschieben :

gradle.projectsEvaluated {
    compileJava.dependsOn(generateSources)
}

Wahrscheinlich gibt es eine idiomatischere Möglichkeit, Ihren Anwendungsfall zu lösen, aber schnelles Durchsuchen der Android-Plug-in-Dokumente Ich konnte keine finden.

28

Sie können die Taskausführung in einem Terminal sehen, in dem der Task ausgeführt wird, zum Beispiel gradle assemble. Probieren Sie dieses aus, es wird praktisch vor allem begonnen.

gradle.projectsEvaluated {
     preBuild.dependsOn(generateSources)
}

Bearbeiten, dies funktioniert möglicherweise nicht in Android Studio, da das Android Gradle DSL kein projectsEvaluated hat Methode.

13

Versuche dies:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.Android.tools.build:gradle:0.4.1'
    }
}

apply plugin: 'Android'

Android {
    buildToolsVersion "17.0.0"
    compileSdkVersion 17

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
}

task generateSources {
    def script = "python GenerateSources.py".execute()
    script.in.eachLine {line -> println line}
    script.err.eachLine {line -> println "ERROR: " + line}
    script.waitFor()
}

project.afterEvaluate {
    preBuild.dependsOn generateSources
}

clean.dependsOn generateSources
clean.mustRunAfter generateSources

Die letzten beiden Zeilen sind optional. Sie rufen die Task "generateSources" auf, wenn eine Gradle-Bereinigung ausgeführt wird

4
Phileo99

Wenn Sie mehrere Projekte erstellen und für jedes Projekt eine Aufgabe ausführen müssen, bevor Sie erstellt werden (es sollte jedoch auch in Ordnung sein, wenn Sie nur das App-Projekt haben), können Sie die Aufgabe im Konfigurationsskript für die Stammerstellung schreiben den allprojects Abschluss und die Ausführung der Aufgabe genau dort.

Im Hauptprojekt build.gradle:

allprojects {
    repositories {
        // ...
    }
    // ...
    task mytask {
        doFirst {
            println project.projectDir.name
        }
    }
    mytask.execute()
}

Es wird auch für jede Build-Variante ausgeführt.

Gradle 4.1

0
devrocca