Выполнить задачу перед компиляцией с помощью плагина 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 и не могу понять, что не так с этим кодом. Поэтому я хотел бы знать, как я могу исправить эту ошибку.
5 ответов
видимо,android
плагин не добавляет compileJava
задач (например,java
плагин будет). Вы можете проверить, какие задачи доступны с помощью gradle tasks --all
и выберите правильный для вашего (в противном случае правильного) объявления зависимости.
EDIT:
видимо,android
плагин откладывает создание задачи таким образом, что они не могут быть доступны с нетерпением, как обычно. Один из способов преодолеть эту проблему-отложить доступ до конца настройки фаза:
gradle.projectsEvaluated {
compileJava.dependsOn(generateSources)
}
скорее всего, есть более идиоматический способ решить ваш случай использования, но быстро просматривать Android плагин docs я не смог найти ни одного.
правильный способ запуска задачи перед компиляцией Java на Android-сделать задачу компиляции для каждого варианта зависит от вашей задачи.
afterEvaluate {
android.applicationVariants.all { variant ->
variant.javaCompiler.dependsOn(generateSources)
}
}
вы можете увидеть выполнение задачи в терминале, выполняющем задачу, например gradle assemble
. Попробуйте этот, он запускается практически раньше всего.
gradle.projectsEvaluated {
preBuild.dependsOn(generateSources)
}
редактировать, это может не работать в Android Studio, так как Android Gradle DSL не имеет projectsEvaluated
метод.
попробуйте это:
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
для тех, кто имеет многопроектную сборку и должен запустить задачу для каждого проекта, прежде чем они будут построены (но это также должно быть нормально, если у вас есть только проект приложения), вы можете написать задачу в корневом сценарии конфигурации сборки внутри allprojects
закрытие и выполнение задачи прямо там.
в корневом проекте build.gradle
:
allprojects {
repositories {
// ...
}
// ...
task mytask {
doFirst {
println project.projectDir.name
}
}
mytask.execute()
}
Он также будет выполняться для каждого варианта сборки.
ш 4.1