Gradle 7 迁移: 应用 PublishPlugin (maven-publish) 失败: 当项目已经被评估时,不能运行 afterEvaluate。

4

我将 Gradle 从 6.8 升级到 7.1.1 后,出现了以下问题:

A problem occurred evaluating script.
> Failed to apply plugin class 'org.gradle.api.publish.plugins.PublishingPlugin'.
   > Cannot run Project.afterEvaluate(Action) when the project is already evaluated.

我的publish.gradle文件抛出异常:

configure(subprojects.findAll({ it.name in ["subpr1", "subpr2", "subpr3"] })) {
    subproject ->
        apply plugin: 'com.android.library'
        apply plugin: 'maven-publish'  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

我在我的build.gradle文件中没有找到任何evaluation*evaluate*任务的用法。

有什么想法可以解决这个问题吗?

我的根build.gradle文件:


buildscript {
    ext.gradle_version = "7.0.0"

    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:$gradle_version"
    }
}

ext {
    ...
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
}

def properties = new Properties()
properties.load(new FileInputStream("local.properties"))

allprojects {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
        maven {
            url = uri("...")
            credentials {
                username = properties.getProperty("...")
                password = properties.getProperty("...")
            }
        }
    }
}

apply plugin: 'android-reporting'

task publishAll() {
    subprojects.each { pr ->
        dependsOn {
            pr.tasks.findAll { task -> task.name.startsWith('publish') }
        }
    }
    outputs.upToDateWhen { false }
}
publishAll.outputs.upToDateWhen { false }

task clean(type: Delete) {
    delete rootProject.buildDir
}

apply from: 'publish.gradle'

我猜测这里出了问题,或者与迁移指南的 "afterEvaluate现在是一个错误"有关。

task publishAll() {
    subprojects.each { pr ->
        dependsOn {
            pr.tasks.findAll { task -> task.name.startsWith('publish') }
        }
    }
    outputs.upToDateWhen { false }
}
publishAll.outputs.upToDateWhen { false }

subproject1build.gradle 文件:

plugins {
    id 'com.android.library'
}

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionName rootProject.ext.cyfaceBackendVersion
        testInstrumentationRunner rootProject.ext.testInstrumentationRunner
    }

    productFlavors {
        a {
            dimension "project"
        }
        b {
            dimension "project"
        }
        mock {
            dimension "mode"
        }
        full {
            dimension "mode"
        }
    }

    buildTypes {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    testOptions {
        unitTests {
            includeAndroidResources = true
            returnDefaultValues = true
        }
    }

    compileOptions {
        sourceCompatibility rootProject.ext.sourceCompatibility
        targetCompatibility rootProject.ext.targetCompatibility
    }

    lintOptions {
        disable 'ObsoleteLintCustomCheck'
    }
}

dependencies {...}


如果我将 apply from: 'publish.gradle' 往上移一点到 build.gradle 中,我会得到另一个错误,我的 publish.gradle 中稍后的 classpath += files(configurations.compile) 行会抛出 MissingPropertyException: Could not get unknown property 'compile' - hb0
2个回答

3
问题是:
apply from: 'publish.gradle'

这是在evaluate阶段之后执行的,因此会出现错误:

Cannot run afterEvaluate when the project is already evaluated

解决方案是在 buildSrc 中编写一个 convention Gradle 插件。
需要跟进的话,可以参考Gradle的这个视频

0
我几乎遇到了同样的问题。 在根build.gradle中有以下代码。
plugins {
    id 'java'
}

description = "MyPrject"

repositories {
    mavenCentral()
}

dependencies {
    implementation(project(":module1"))
    implementation(project(":module2"))
    implementation(project(":module3"))
}

...

gradle.projectsEvaluated {

    subprojects {

        apply plugin: 'java'
        apply plugin: 'maven-publish'

        repositories {
            mavenCentral()
        }

        task sourcesJar(type: Jar, dependsOn: classes) {
            archiveClassifier.set("sources")
            from sourceSets.main.allSource
        }

        jar {
            manifest {
                attributes(
                        'Implementation-Title': 'MyPrject',
                        'Implementation-Version': project.version
                )
            }
        }

        publishing {
            publications {
                mavenJava(MavenPublication) {
                    artifactId "$archivesBaseName"

                    from components.java
                    artifact sourcesJar
                }
            }

            repositories {
                ...
            }
        }

    }
}

在我的情况下,解决方案是从子项目部分中删除apply plugin命令,并将其添加到所有模块的build.gradle文件中(module1/build.gradle、module2/build.gradle和module3/build.gradle)。
plugins {
    id 'java'
    id 'maven-publish'
}

在 Gradle 7.X 版本构建成功之后


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接