Uruchom zadanie przed kompilacją za pomocą wtyczki Android Gradle

Mam bardzo prosty build.gradle plik o następującej treści:

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

Chcę uruchomić generateSources zadanie przed uruchomieniem kompilacji Javy. Znalazłem kilka rozwiązań, jak to zrobić, jak compileJava.dependsOn("generateSources"), ale niestety dają błąd:

A problem occurred evaluating root project 'Android'.
> Could not find property 'compileJava' on root project 'Android'.
Nie znam Gradle ' a i nie rozumiem co jest nie tak z tym kodem. Więc chciałbym wiedzieć, jak mogę naprawić ten błąd.
Author: Michael, 2013-05-31

5 answers

Najwyraźniej wtyczka android nie dodaje zadania compileJava (tak jak wtyczka java). Możesz sprawdzić, które zadania są dostępne za pomocą gradle tasks --all i wybrać właściwe dla swojej (w przeciwnym razie poprawnej) deklaracji zależności.

EDIT:

Najwyraźniej wtyczka android opóźnia tworzenie zadań w taki sposób, że nie można do nich uzyskać jak zwykle chętnie. Jednym ze sposobów na rozwiązanie tego problemu jest odroczenie dostępu do końca fazy konfiguracji :

gradle.projectsEvaluated {
    compileJava.dependsOn(generateSources)
}

Szanse są że istnieje bardziej idiomatyczny sposób, aby rozwiązać swój przypadek użycia, ale szybko przeglądając Android plugin docs nie mogłem znaleźć.

 27
Author: Peter Niederwieser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-31 10:07:59

Właściwym sposobem uruchomienia zadania przed kompilacją Javy na Androidzie jest uzależnienie zadania kompilacji dla każdego wariantu od Twojego zadania.

afterEvaluate {
  android.applicationVariants.all { variant ->
    variant.javaCompiler.dependsOn(generateSources)
  }
}
 23
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-31 12:57:17

Możesz zobaczyć wykonanie zadania w terminalu uruchamiającym zadanie na przykład gradle assemble. Spróbuj tego, zaczyna się praktycznie przed czymkolwiek.

gradle.projectsEvaluated {
     preBuild.dependsOn(generateSources)
}

Edit , może to nie działać w Android Studio, Ponieważ Android Gradle DSL nie ma metody projectsEvaluated.

 12
Author: zest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-22 12:37:08

Spróbuj tego:

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

Ostatnie dwie linie są opcjonalne - wywołują zadanie "generateSources" podczas wykonywania gradle clean

 2
Author: Phileo99,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-17 20:37:13

Dla tych, którzy mają kompilację wielu projektów i muszą uruchomić zadanie dla każdego projektu przed ich zbudowaniem (ale powinno być również ok, jeśli masz tylko projekt aplikacji), możesz napisać zadanie w skrypcie konfiguracji root build wewnątrz zamknięcia allprojects i wykonać zadanie tutaj.

W projekcie root build.gradle:

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

Będzie on wykonywany również dla każdego wariantu budowania.

Gradle 4.1

 0
Author: devrocca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-16 12:27:50