#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.