Gradle:过滤并执行给定任务中的任务

时间:2019-04-02 16:14:10

标签: android gradle groovy travis-ci

我想运行./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()不会调用其依赖项,因此某些任务由于未调用其依赖项而失败。

在gradle中有什么方法可以实现这一目标。多谢!

2 个答案:

答案 0 :(得分:3)

executeTask类的方法。您正在尝试绕过Gradle构建系统。执行任务或创建实例并调用execute并不是一件简单的事情。 Gradle处理依赖项注入,缓存,输入和输出处理以及各种处理。因此,请充分利用Gradle。

1)

创建一个 lifecycle任务,它是您要执行的所有操作的父任务。

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

代码遵循Task Conviguration Avoidance。这意味着除非您专门调用它们,否则不会配置您定义的任务。运行构建时,这应该节省资源(CPU和内存)。

3)

要为所有模块自动执行此操作,请选择以下一项或两项,并放入您的根项目 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.
            }
        }
    }
}

答案 1 :(得分:0)

将其放在项目级别的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 }
}