【问题标题】:why does tasks.all works well but tasks.matching not when adding dependencies?为什么在添加依赖项时tasks.all 运行良好但tasks.matching 不行?
【发布时间】:2021-08-23 09:26:24
【问题描述】:

我想将所有风格的测试添加到元任务中。 这不起作用:

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)
            }
        }
    }


}

}

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

【问题讨论】:

    标签: gradle android-gradle-plugin


    【解决方案1】:

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

    但是你所有的版本都有一个很大的缺点,就是导致每一个任务都被实现,因为要查看matching或者all里面的名字,任务当然需要实现,所以task-configuration避免避免。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 2021-03-13
      • 2020-06-04
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      相关资源
      最近更新 更多