Подтвердить что ты не робот

Запуск задачи перед компиляцией с помощью 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 и не могу понять, что не так с этим кодом. Поэтому я хотел бы знать, как я могу исправить эту ошибку.

4b9b3361

Ответ 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