如何判断Gradle任务的类型?替代命名匹配的实现方案
基于任务类型替代命名约定的Gradle配置方案
没问题,咱们可以直接通过任务的实际类型来做判断,完全摆脱对命名规则的依赖。你之前用instanceof没生效,大概率是没指定正确的任务类全限定名,或者没导入对应的类。
正确实现代码
首先确保导入protobuf插件对应的任务类,然后直接用instanceof判断:
import com.google.protobuf.gradle.GenerateProtoTask allprojects { tasks.whenTaskAdded { task -> if (task instanceof GenerateProtoTask) { // 基于任务类型判断,替代命名匹配 task.dependsOn(protolockStatus) task.finalizedBy(protolockCommit) } } }
关键细节说明
- 任务类的全限定名:这里用的
com.google.protobuf.gradle.GenerateProtoTask是Google官方protobuf Gradle插件定义的生成任务类型。如果你使用的是其他Proto相关插件,需要替换为对应插件提供的任务类全限定名。 - 避免导入的写法:如果不想显式导入类,也可以直接用全限定名做判断:
allprojects { tasks.whenTaskAdded { task -> if (task instanceof com.google.protobuf.gradle.GenerateProtoTask) { task.dependsOn(protolockStatus) task.finalizedBy(protolockCommit) } } } - 为什么之前的尝试失败:你提到的
type instanceof写法有误——Gradle任务的type属性返回的是Class对象,正确的类型判断应该是task instanceof 目标类,或者用task.type.isAssignableFrom(GenerateProtoTask)(后者适合判断父类/接口关系)。
额外小技巧
如果只是想匹配类名(不推荐,可能有冲突),也可以通过task.type.name来判断:
allprojects { tasks.whenTaskAdded { task -> if (task.type.name == 'GenerateProtoTask') { task.dependsOn(protolockStatus) task.finalizedBy(protolockCommit) } } }
内容的提问来源于stack exchange,提问作者Noel Yap
相关产品推荐
相关产品推荐

