Миграция Gradle 7: Не удалось применить PublishPlugin (maven-публикация): Не удается запустить afterEvaluate, когда проект уже оценен

#gradle #android-gradle-plugin #maven-publish

Вопрос:

После обновления 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'  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 

Я не нашел evaluation* evaluate* в своих файлах никаких использований или задач build.gradle .

Есть идеи, как это исправить?

Мой корень 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'

 

Я предполагаю, что здесь что-то не так и/или что это связано с разделом руководства по миграции «afterEvalute теперь является ошибкой».

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

Из build.gradle subproject1 :

 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 {...}

 

Комментарии:

1. Если я apply from: 'publish.gradle' немного продвинусь build.gradle вперед, вместо этого я получу еще одну ошибку, строка classpath = files(configurations.compile) позже в моем publish.gradle сообщении «Исключение MissingPropertyException: Не удалось получить неизвестное свойство «компиляция».

Ответ №1:

Проблема в том, что:

 apply from: 'publish.gradle'
 

Который выполняется после evaluate фазы и, таким образом, ошибка:

 Cannot run afterEvaluate when the project is already evaluated
 

Решение состоит в том, чтобы написать convention плагин gradle buildSrc .

Чтобы продолжить, посмотрите, например, это видео из Gradle.