为什么 tasks.all 工作正常但 tasks.matching 在添加依赖项时却不行?

why does tasks.all works well but tasks.matching not when adding dependencies?

我想将各种类型的测试添加到元任务中。 这不起作用:

subprojects {

 task("testAllFlavors"){
    val buildTask = this
    tasks.matching {
        name.startsWith("test") && name.endsWith("DebugUnitTest")
        }.all {
        buildTask.dependsOn(this)
}
}

这也行不通:

subprojects {

 task("testAllFlavors"){
setDependsOn(tasks.matching {
           name.startsWith("test") && name.endsWith("DebugUnitTest")
        })
}
}

但这确实有效:

subprojects {
 task("testAllFlavors"){
 val buildTask = this
        tasks.all {
            if(name.startsWith("test") && name.endsWith("DebugUnitTest")) {
                buildTask.dependsOn(this)
            }
        }
    }


}

}

这3个选项有什么区别?长得和我一样吗?为什么只有第三个选项有效?我使用 gradle 7.1 和 AGP 4.2

里面的“匹配”this不是你想的那样。 这是 testAllFlavors 任务,所以你总是检查它的名称,因此你的条件总是 false。 你需要 it.name...。 另一方面,在 all 中,this 是“内部”任务,这就是您的第三个变体起作用的原因。

但是你的所有版本都有一个很大的缺点,它们会导致每一个任务都被实现,因为要检查matchingall中的名称,任务需要被实​​现当然,所以避免了任务配置。

你至少应该先按类型匹配任务,至少将需要实现的任务限制为所有该类型,然后检查它们的名称,你也不需要使用all,但可以只将过滤后的任务集合提供给 dependsOn,所以像这样:

tasks.register("testAllFlavors") {
    dependsOn(tasks.withType<AbstractTestTask>().matching {
        it.name.startsWith("test") && it.name.endsWith("DebugUnitTest")
    })
}