为什么 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
是“内部”任务,这就是您的第三个变体起作用的原因。
但是你的所有版本都有一个很大的缺点,它们会导致每一个任务都被实现,因为要检查matching
或all
中的名称,任务需要被实现当然,所以避免了任务配置。
你至少应该先按类型匹配任务,至少将需要实现的任务限制为所有该类型,然后检查它们的名称,你也不需要使用all
,但可以只将过滤后的任务集合提供给 dependsOn
,所以像这样:
tasks.register("testAllFlavors") {
dependsOn(tasks.withType<AbstractTestTask>().matching {
it.name.startsWith("test") && it.name.endsWith("DebugUnitTest")
})
}
我想将各种类型的测试添加到元任务中。 这不起作用:
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
是“内部”任务,这就是您的第三个变体起作用的原因。
但是你的所有版本都有一个很大的缺点,它们会导致每一个任务都被实现,因为要检查matching
或all
中的名称,任务需要被实现当然,所以避免了任务配置。
你至少应该先按类型匹配任务,至少将需要实现的任务限制为所有该类型,然后检查它们的名称,你也不需要使用all
,但可以只将过滤后的任务集合提供给 dependsOn
,所以像这样:
tasks.register("testAllFlavors") {
dependsOn(tasks.withType<AbstractTestTask>().matching {
it.name.startsWith("test") && it.name.endsWith("DebugUnitTest")
})
}