2013-05-31 4 views
32

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

+0

Я думаю, что в этой теме вы найдете решение [assembleRelease зависимость задачи - Попросите хранилища ключей пароля] [1] [1]: http://stackoverflow.com/questions/17144878/ assemblerelease-task-dependency-ask-for-keystore-password – skyrylyuk

ответ

22

Надлежащим образом выполнить задачу перед Java компиляции на Android заключается в том, чтобы задача компиляции для каждого варианта зависела от вашей задачи.

afterEvaluate { 
    android.applicationVariants.all { variant -> 
    variant.javaCompiler.dependsOn(generateSources) 
    } 
} 
+0

Где вы звоните в свою собственную задачу здесь? –

+1

'generateSources' - это настраиваемая задача. Задачи 'javaCompiler' становятся зависимыми от' generateSources'. – Michael

+0

Я получаю сообщение об ошибке: ** Не удалось найти свойство 'android' в корневом проекте ** –

27

Видимо, плагин android не добавляет задачи compileJava (например, плагин java). Вы можете проверить, какие задачи доступны с помощью gradle tasks --all, и выбрать правильный вариант для вашего (в противном случае правильного) объявления зависимости.

EDIT:

Видимо, android плагин отсрочивает создание задач таким образом, что они не могут быть доступны с нетерпением, как обычно. Одним из способов решения этой проблемы является отложить доступ до конца фазы конфигурации:

gradle.projectsEvaluated { 
    compileJava.dependsOn(generateSources) 
} 

Скорее всего, что есть более идиоматический способ решить случай использования, но быстро просматривает Android plugin docs я не мог» найти его.

+0

Я попытался это сделать, но это тоже не сработает. – Michael

+0

Что это не работает, и что такое сообщение об ошибке? –

+2

Проблема такая же, как и раньше: 'Не удалось найти свойство« compileDebug »в корневом проекте« Android ». – Michael

10

Вы можете увидеть выполнение задачи в задании на работу терминала, например gradle assemble. Попробуйте это, он запускается практически ни перед чем.

gradle.projectsEvaluated { 
    preBuild.dependsOn(generateSources) 
} 

Редактировать, это не может работать в Android Studio, как Android Gradle DSL не имеет метода projectsEvaluated.

+0

Что? Я получаю сообщение об ошибке: ** Не удалось найти свойство preBuild в корневом проекте ** –

+0

Итак, возможно, он не существует сейчас в более новых версиях Gradle – zest

+0

Было ли это когда-либо в Android Studio? Или вы вообще говорили о Gradle ... –

2

Попробуйте это:

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 чистой

+0

Я получаю сообщение об ошибке: ** Не удалось найти свойство 'preBuild' on project ': app' ** –

1

Для тех, кто имеет построить несколько проектов и необходимости выполнения задачи для каждого проекта, прежде чем они построены (но это должно быть хорошо, если у вас есть только проект приложения), вы можете написать задачу в сценарии конфигурации корневой сборки внутри закрытия allprojects и выполнения задачи прямо там.

В корневом проекте build.gradle:

allprojects { 
    repositories { 
     // ... 
    } 
    // ... 
    task mytask { 
     doFirst { 
      println project.projectDir.name 
     } 
    } 
    mytask.execute() 
} 

Это будет выполняться для каждого варианта сборки, а также.

Gradle 4.1

Смежные вопросы