Пользовательская задача Android Gradle для каждого варианта

У меня есть приложение для Android, созданное с помощью Gradle, которое содержит BuildTypes и Product Flavors (варианты). Например, я могу запустить эту команду для создания определенного apk:

./gradlew testFlavor1Debug
./gradlew testFlavor2Debug

Мне нужно создать пользовательскую задачу в build.gradle для каждого варианта, например:

./gradlew myCustomTaskFlavor1Debug

Я создал для этого задачу:

android.applicationVariants.all { variant ->
    task ("myCustomTask${variant.name.capitalize()}") {
        println "*** TEST ***"
        println variant.name.capitalize()
    }
}

Моя проблема в том, что эта задача вызывается для ВСЕХ вариантов, а не только одного, который я запускаю. Выход:

./gradlew myCustomTaskFlavor1Debug

*** TEST ***
Flavor1Debug
*** TEST ***
Flavor1Release
*** TEST ***
Flavor2Debug
*** TEST ***
Flavor2Release

Ожидаемый результат:

./gradlew myCustomTaskFlavor1Debug

*** TEST ***
Flavor1Debug

Как я могу определить пользовательскую задачу, динамическую, для каждого варианта, а затем вызвать ее с правильным вариантом?


person Nicola    schedule 19.03.2015    source источник


Ответы (2)


Это происходит потому, что логика выполняется во время настройки. Попробуйте добавить действие (<<):

android.applicationVariants.all { variant ->
    task ("myCustomTask${variant.name.capitalize()}") << {
        println "*** TEST ***"
        println variant.name.capitalize()
    }
}
person Opal    schedule 19.03.2015
comment
Я только что обнаружил это сам :( все равно спасибо за подсказку! - person Nicola; 19.03.2015

После ответа Опала и устарел оператор << начиная с Gradle 3.2, правильный ответ должен быть:

android.applicationVariants.all { variant ->
    task ("myCustomTask${variant.name.capitalize()}") {
        // This code runs at configuration time

        // You can for instance set the description of the defined task
        description = "Custom task for variant ${variant.name}"

        // This will set the `doLast` action for the task..
        doLast {
            // ..and so this code will run at task execution time
            println "*** TEST ***"
            println variant.name.capitalize()
        }
    }
}
person ovmjm    schedule 11.08.2018