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. 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źć.
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)
}
}
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
.
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
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
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