Gradle Task из плагина не запускается на «Build», но запускается на «Clean» - PullRequest
0 голосов
/ 11 февраля 2019

У нас есть проект Android, для которого требуется выполнить определенную задачу плагина Gradle, прежде чем мы создадим APK.(Плагин написан нами)

Мы хотим запускать задачу автоматически перед каждой сборкой .

Если мы используем устаревший task.execute(), мы получаем предупреждениечто он будет недоступен, начиная с версии 5.0 или чего-то подобного.

Если мы используем dependsOn в соответствии с рекомендациями, то testTask1 не до BUILD, а только после CLEAN.(все объяснено в комментариях ниже)

Я изучил документацию gradle и многие другие SO-темы, но мне еще предстоит найти решение.

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {

    repositories {
        flatDir { dirs 'libs' }
        jcenter()
        google()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:3.1.3"

        // our platform-tools plugin, in charge of some gradle tasks
        classpath 'sofakingforevre:test-plugin:1.0-SNAPSHOT'
    }
}


apply plugin: 'test-plugin'


allprojects {
    repositories {
        jcenter()
        google()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


// OPTION 1 - USING EXECUTE()

// this task works as expected when calling "clean", but also when calling "assemble".
// the problem here is that the "execute" method has been deprecated, and we want to prepare for Gradle 5.0

// CLEAN - testTask1 is called :)
// BUILD - testTask1 is called :)
// DEPRECATION WARNING :(
task buildPlatformExecute {

    println("executing")

    // this task is created by the plugin
    tasks.getByName("testTask1").execute()


}

clean.dependsOn buildPlatformExecute

// OPTION 2 - USING DEPENDSON()

// this tasks works as expected when calling "clean", but DOES NOT WORK when calling "assemble".
// If we call we call assemble, the "executing" text does print, but "testTask1" would not run.

// CLEAN - testTask1 is called :)
// BUILD - testTask1 is NOT CALLED :(
task buildPlatformDependency {

    println("executing")

    // this task is created by the plugin
    dependsOn 'testTask1'
}

clean.dependsOn buildPlatformDependency

1 Ответ

0 голосов
/ 12 февраля 2019

Проблемы с вашим ВАРИАНТОМ 1 решения

  • вы используете устаревший task.execute() API (вы уже знаете об этом)
  • вы смешиваете конфигурация и фазы выполнения (распространенная ошибка Gradle ...):

Поскольку вы не завершили tasks.getByName("testTask1").execute() вБлок doLast {} из doFirst {} в задаче buildPlatformExecute: задача testTask1 всегда будет выполняться независимо от того, какую задачу вы будете вызывать.Вам даже не нужно создавать зависимость между задачей clean и вашей пользовательской задачей (например: попробуйте выполнить простую задачу «справки» с ./gradlew help, вы увидите, что testTask1 также выполняется: это, конечно, не то, что вам нужно)

Дополнительная информация здесь: https://docs.gradle.org/current/userguide/build_lifecycle.html

Проблема с вашим OPTION2 решением

Вы создали зависимость между clean задача и buildPlatformDependency задача:

  • при выполнении clean задач задача testTask1 будет выполняться должным образом, но
  • нет зависимости между build (или assemble) задача и clean задача: поэтому при выполнении задачи build задача clean не выполняется (поэтому testTask1 не будет запущена)

Решение

Наилучшим подходом было бы зацепить пользовательскую задачу testTask1 в правильном месте в жизненном цикле сборки вашего проекта, используя Task.dependsOn API.«Правильное» место зависит от того, за что отвечает ваша задача в процессе сборки: например, если ваша задача должна быть выполнена ДО задачи assemble, просто создайте зависимость assemble.dependsOn testTask1

...