Выполнить задачу перед компиляцией с помощью плагина 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