Gradle: фильтровать и выполнять задачи из заданной задачи - PullRequest
0 голосов
/ 02 апреля 2019

Я хочу запустить ./gradlew verifyProjectDebug для запуска подмножества задач проверки.

verifyProjectDebug пытается извлечь подмножество задач в проекте и выполнить их.

static def isValidTask(String name) {
    def isLint = name.matches("lint.*Debug")
    def isKtlint = name.matches("ktlint.*Debug.*Check")
    def isUnitTest = name.matches("test((?!Prod|Staging).)*DebugUnitTest")

    return (isLint || isKtlint || isUnitTest) && !name.contains("Prod")
}

task verifyProjectDebug() {
    group = "verification"
    description = "Runs lint, ktlint and tests for all debug non-production variants"

    doLast {
        getSubprojects()
                .collect { it.tasks }
                .flatten()
                .findAll { isValidTask(it.name) }
                .each { it.execute() }
    }
}

К сожалению, вызов .execute () для задачи не вызывает ее зависимости, поэтому некоторые задачи не выполняются, потому что ее зависимости не были вызваны.

Есть ли способ в градле, которого я могу достичь? Спасибо за тонну!

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

execute - это метод класса Task.Вы пытаетесь обойти систему сборки Gradle.Выполнение задач - это непростое дело или создание экземпляра и вызов execute.Gradle обрабатывает внедрение зависимостей, кэширование, обработку ввода и вывода, все виды вещей.Поэтому используйте Gradle.

1)

Создайте одну задачу жизненного цикла , которая является родительской задачей для всего, что вы хотите выполнить.

final def verifyProject = tasks.register("verifyProject")

Жизненный циклзадача - это задача, которая не выполняет никакой работы, она зависит только от других задач.

2)

Вы можете ссылаться только на уже созданные задачи.Например, вы не можете ссылаться на задачу lint варианта отладки, пока не создан вариант отладки.

Обработайте каждый вариант при его создании, найдите все задачи, которые вы хотите выполнить, и подключите их к основной задаче.

android.applicationVariants.all {
    final def cappedVariantName = name.capitalize()

    // For every build variant that has build type "debug"...
    if (variant.buildType == "debug") {
        verifyProject.configure {
            dependsOn("lint$cappedVariantName")
            dependsOn("ktlint$cappedVariantName")
            dependsOn("test${cappedVariantName}UnitTest")
        }
    }
}

Пожалуйста, проверьте имена задач, которые вы хотите выполнить.

Теперь, когда вы запустите gradlew verifyProject, все задачи, от которых зависит эта задача, будут выполнены.Вы отвечаете за зависимости.

Если вы хотите использовать это в модуле библиотеки Android, замените android.applicationVariants на android.libraryVariants.

Код следует Избегание конфигурации задачи.Это означает, что заданные вами задачи не будут настроены, если вы специально не вызовете их.Это должно сэкономить ресурсы (ЦП и память) при запуске сборки.

3)

Чтобы сделать это автоматически для всех модулей, выберите один или оба из следующих параметров и поместите их на * 1037.* корневой проект build.gradle.

subprojects { project ->
    project.plugins.whenPluginAdded { plugin ->
        // For all libraries and only libraries:
        if (plugin instanceof com.android.build.gradle.LibraryPlugin) {
            project.android.libraryVariants.all { variant ->
                // See above.
            }
        }
        // For all apps and only apps:
        if (plugin instanceof com.android.build.gradle.AppPlugin) {
            project.android.applicationVariants.all { variant ->
                // See above.
            }
        }
    }
}
0 голосов
/ 05 апреля 2019

Поместив это в файл Gradle уровня проекта, добился цели.

task verifyDebugProjects() {
    group = "verification"
    description = "Runs lint, ktlint and tests for all debug non-production variants"
}

static def isValidVerifyDebugTask(String name) {
    def isLint = name.matches("lint.*Debug")
    def isKtlint = name.matches("ktlint.*Debug.*Check")
    def isUnitTest = name.matches("test((?!Prod|Staging).)*DebugUnitTest")

    return (isLint || isKtlint || isUnitTest) && !name.contains("Prod")
}

gradle.projectsEvaluated {
    getSubprojects()
            .collect { it.tasks }
            .flatten()
            .findAll { isValidVerifyDebugTask(it.name) }
            .each { verifyDebugProjects.dependsOn it }
}
...