Запуск задачи перед компиляцией с помощью Android Gradle плагина
У меня есть очень простой файл build.gradle
со следующим содержимым:
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()
}
}
Я хочу запустить задачу generateSources
перед запуском java-компиляции. Я нашел несколько решений, как это сделать, например compileJava.dependsOn("generateSources")
, но, к сожалению, они дают ошибку:
A problem occurred evaluating root project 'Android'.
> Could not find property 'compileJava' on root project 'Android'.
Я не знаю Gradle и не могу понять, что не так с этим кодом. Поэтому я хотел бы знать, как я могу исправить эту ошибку.
Ответы
Ответ 1
Правильный способ запуска задачи перед компиляцией Java на Android состоит в том, чтобы сделать задачу компиляции для каждого варианта зависящей от вашей задачи.
afterEvaluate {
android.applicationVariants.all { variant ->
variant.javaCompiler.dependsOn(generateSources)
}
}
Ответ 2
По-видимому, плагин android
не добавляет задачи compileJava
(например, плагин java
). Вы можете проверить, какие задачи доступны с помощью gradle tasks --all
, и выбрать правильный вариант для вашего (в противном случае правильного) объявления зависимости.
ИЗМЕНИТЬ:
По-видимому, плагин android
откладывает создание задач таким образом, что они не могут быть доступны с нетерпением, как обычно. Один из способов преодоления этой проблемы - отложить доступ до конца фазы конфигурации:
gradle.projectsEvaluated {
compileJava.dependsOn(generateSources)
}
Скорее всего, есть более идиоматический способ решения вашего варианта использования, но быстро просматривая Android-плагины, я не смог его найти.
Ответ 3
Вы можете увидеть выполнение задачи в запущенной работе терминала, например gradle assemble
. Попробуйте это, он запускается практически ни перед чем.
gradle.projectsEvaluated {
preBuild.dependsOn(generateSources)
}
Изменить, это может не работать в Android Studio, поскольку DSL для Android Gradle не имеет метода projectsEvaluated
.
Ответ 4
Попробуйте следующее:
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
Последние две строки являются необязательными - они будут вызывать задачу "generateSources" при выполнении gradle clean