升级Gradle7.0后myTask任务创建冲突交替报错如何解决?
问题根因
Gradle 7.0 对任务覆盖规则做了破坏性变更:overwrite: true 参数仅允许用于替换已真实存在的同名任务,若目标任务不存在时强行传入该参数,就会触发「无需替换不存在的任务」报错。
你之前的非空判断未生效,大概率是使用了project.tasks.named('myTask')做存在性校验,该API在任务不存在时会直接抛出异常而非返回空,因此无法起到判断作用。
正确解决方案
推荐优先从根源避免任务重复创建,再适配Gradle7.0+的规则做兼容处理:
- 第一步:在插件入口添加去重逻辑,避免同一个模块重复应用插件导致任务重复创建
// 插件逻辑最开头添加去重判断 if (project.plugins.hasPlugin('myPlugin')) { return }
- 第二步:修改任务创建逻辑,先通过
findByName判断任务是否存在,再决定是否传overwrite参数,同时优先使用Gradle推荐的register()方法提升构建性能
def existedTask = project.tasks.findByName('myTask') if (existedTask != null) { // 仅当任务已存在时添加overwrite参数覆盖 project.tasks.create( name: 'myTask', overwrite: true, // 你的原有任务配置,比如type、group等 type: MyTaskClass ) } else { // 任务不存在时直接注册,无需传overwrite参数 project.tasks.register('myTask', MyTaskClass) { // 你的原有任务配置逻辑 } }
如果你的场景必须使用create()而非register(),把else分支的register替换为不带overwrite参数的create即可。
内容的提问来源于stack exchange,提问作者ashishbg
相关产品推荐
相关产品推荐

