【问题标题】:TaskGraph.useFilter alternates for kotlin dslTaskGraph.useFilter 替代 kotlin dsl
【发布时间】:2019-11-14 21:57:15
【问题描述】:
我正在从 gradle 中寻找这行代码的替代方法,我正在寻找它在 kotlin dsl 中的对应部分,任何人都可以对此有所了解,因为它阻碍了我的构建,并且由于 usefilter 不可用而不知所措在 kotlin dsl 中
gradle.taskGraph.useFilter {
if (task.name.contains("GoogleServices") && (task.name.contains("Perf") || task.name.contains("Demo") || task.name.contains("Dev") || task.name.contains("Debug"))) {
return false
}
return true
}
【问题讨论】:
标签:
android
gradle
kotlin
gradle-kotlin-dsl
【解决方案1】:
useFilter 是在非公共接口TaskExecutionGraphInternal 中声明的方法,它是公共TaskExecutionGraph 的子类型,由实际的任务图实现类实现。
对useFilter 的调用在Groovy 中工作是因为动态调度:它在运行时搜索实际类的所有方法,从而允许调用那些无法通过公共API 获得的方法。
在 Kotlin 中,您必须将任务图显式转换为该接口才能静态调用此方法:
(gradle.taskGraph as org.gradle.execution.taskgraph.TaskExecutionGraphInternal)
.useFilter { it.name.contains("GoogleServices") && ... }
请注意,使用非公共 Gradle API 会使您的构建变得脆弱,并且对升级 Gradle 版本很敏感。