Gradle 7迁移应用maven-publish报错:项目已评估无法执行afterEvaluate
问题根源
Gradle 7.0+ 新增了限制:项目评估完成后不允许再调用afterEvaluate方法。你遇到报错是因为执行顺序错误:
- 根目录
build.gradle先定义了publishAll任务,任务配置阶段遍历所有子项目查找publish开头的任务,这个操作会触发子项目提前完成评估 - 之后才执行
apply from: 'publish.gradle'给指定子项目应用maven-publish插件,而该插件内部会调用afterEvaluate做初始化,此时子项目已经评估完成,直接触发报错
修复步骤
- 调整根目录build.gradle的代码顺序
把apply from: 'publish.gradle'移动到publishAll任务定义之前,确保子项目的插件配置在任务遍历之前完成:
// 原有allprojects配置不变 allprojects { repositories { google() mavenCentral() gradlePluginPortal() maven { url = uri("...") credentials { username = properties.getProperty("...") password = properties.getProperty("...") } } } } apply plugin: 'android-reporting' // 新增:先应用publish配置,再定义publishAll任务 apply from: 'publish.gradle' task publishAll() { subprojects.each { pr -> dependsOn { pr.tasks.findAll { task -> task.name.startsWith('publish') } } } outputs.upToDateWhen { false } } // 后面的clean任务等保持不变
如果调整顺序后仍然报错,可以优化publishAll的写法,避免提前触发子项目评估:
task publishAll { outputs.upToDateWhen { false } } // 等所有项目都评估完成后再添加依赖 gradle.projectsEvaluated { subprojects.each { pr -> publishAll.dependsOn pr.tasks.matching { it.name.startsWith('publish') } } }
- 移除重复的插件应用
你的子项目build.gradle已经声明了com.android.library插件,可以去掉publish.gradle里的apply plugin: 'com.android.library'行,避免重复配置带来的潜在问题。
内容的提问来源于stack exchange,提问作者hb0
相关产品推荐
相关产品推荐

