You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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)
        }
    }
}

关键细节说明

  1. 任务类的全限定名:这里用的com.google.protobuf.gradle.GenerateProtoTask是Google官方protobuf Gradle插件定义的生成任务类型。如果你使用的是其他Proto相关插件,需要替换为对应插件提供的任务类全限定名。
  2. 避免导入的写法:如果不想显式导入类,也可以直接用全限定名做判断:
    allprojects {
        tasks.whenTaskAdded { task ->
            if (task instanceof com.google.protobuf.gradle.GenerateProtoTask) {
                task.dependsOn(protolockStatus)
                task.finalizedBy(protolockCommit)
            }
        }
    }
    
  3. 为什么之前的尝试失败:你提到的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:17:27