From a9a6bee048ebb081976019d460cdc759805c10d4 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Tue, 25 Feb 2020 17:43:28 -0800 Subject: [PATCH] Clarify errors when AGP isn't available (#779) Signed-off-by: Alex Saveau --- .../validation/RuntimeValidationPlugin.kt | 28 +++++++++++++++++++ .../common/validation/RuntimeValidator.kt | 9 ++++-- .../gradle/common/validation/Validation.kt | 16 +++-------- .../gradle/play/PlayPublisherPlugin.kt | 2 +- testapp/build.gradle.kts | 2 +- 5 files changed, 40 insertions(+), 17 deletions(-) create mode 100644 common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/RuntimeValidationPlugin.kt diff --git a/common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/RuntimeValidationPlugin.kt b/common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/RuntimeValidationPlugin.kt new file mode 100644 index 000000000..6dc0740a2 --- /dev/null +++ b/common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/RuntimeValidationPlugin.kt @@ -0,0 +1,28 @@ +package com.github.triplet.gradle.common.validation + +import com.android.Version +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.util.GradleVersion +import org.gradle.util.VersionNumber + +internal class RuntimeValidationPlugin : Plugin { + override fun apply(project: Project) { + check(project === project.rootProject) + + val agpVersion = try { + VersionNumber.parse(Version.ANDROID_GRADLE_PLUGIN_VERSION) + } catch (e: NoClassDefFoundError) { + null + } + val validator = RuntimeValidator( + GradleVersion.current(), MIN_GRADLE_VERSION, agpVersion, MIN_AGP_VERSION) + + validator.validate() + } + + private companion object { + val MIN_GRADLE_VERSION = GradleVersion.version("6.2") + val MIN_AGP_VERSION = VersionNumber.parse("3.6.0") + } +} diff --git a/common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/RuntimeValidator.kt b/common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/RuntimeValidator.kt index 33384e371..8389e8dc6 100644 --- a/common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/RuntimeValidator.kt +++ b/common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/RuntimeValidator.kt @@ -7,7 +7,7 @@ internal class RuntimeValidator( private val currentGradleVersion: GradleVersion, private val minGradleVersion: GradleVersion, - private val currentAgpVersion: VersionNumber, + private val currentAgpVersion: VersionNumber?, private val minAgpVersion: VersionNumber ) { fun validate() { @@ -27,11 +27,14 @@ internal class RuntimeValidator( } private fun validateAgp() { - check(currentAgpVersion >= minAgpVersion) { + check(null != currentAgpVersion && currentAgpVersion >= minAgpVersion) { """ |Gradle Play Publisher's minimum Android Gradle Plugin version is at least - |$minAgpVersion and yours is $currentAgpVersion. Find the latest version and upgrade + |$minAgpVersion and yours is ${currentAgpVersion ?: "unknown"}. Make sure you've applied + |the AGP alongside this plugin. Find the latest AGP version and upgrade |instructions at https://developer.android.com/studio/releases/gradle-plugin. + |For GPP installation docs, see here: + |https://github.com/Triple-T/gradle-play-publisher#installation """.trimMargin() } } diff --git a/common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/Validation.kt b/common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/Validation.kt index dbf08d611..42a009d8d 100644 --- a/common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/Validation.kt +++ b/common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/Validation.kt @@ -1,24 +1,16 @@ package com.github.triplet.gradle.common.validation -import com.android.Version import com.android.build.gradle.api.ApplicationVariant +import org.gradle.api.Project import org.gradle.api.logging.Logger -import org.gradle.util.GradleVersion -import org.gradle.util.VersionNumber - -private val MIN_GRADLE_VERSION = GradleVersion.version("6.2") -private val MIN_AGP_VERSION = VersionNumber.parse("3.6.0-rc03") +import org.gradle.kotlin.dsl.apply /** * Validates required dependencies. If GPP can't run in the current context, an error will be * thrown. */ -fun validateRuntime() { - val agpVersion = VersionNumber.parse(Version.ANDROID_GRADLE_PLUGIN_VERSION) - val validator = RuntimeValidator( - GradleVersion.current(), MIN_GRADLE_VERSION, agpVersion, MIN_AGP_VERSION) - - validator.validate() +fun Project.validateRuntime() { + rootProject.plugins.apply(RuntimeValidationPlugin::class) } /** @return true if the variant is *not* debuggable and can therefore be published. */ diff --git a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/PlayPublisherPlugin.kt b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/PlayPublisherPlugin.kt index 24ca3c1c2..ea76a74e1 100644 --- a/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/PlayPublisherPlugin.kt +++ b/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/PlayPublisherPlugin.kt @@ -51,7 +51,7 @@ import kotlin.reflect.KMutableProperty1 @Suppress("unused") // Used by Gradle internal class PlayPublisherPlugin : Plugin { override fun apply(project: Project) { - validateRuntime() + project.validateRuntime() project.extensions.create(PLAY_PATH) project.plugins.withType { diff --git a/testapp/build.gradle.kts b/testapp/build.gradle.kts index 38c4ca1ef..3c8bcf57e 100644 --- a/testapp/build.gradle.kts +++ b/testapp/build.gradle.kts @@ -16,7 +16,7 @@ buildscript { dependencies { classpath(kotlin("gradle-plugin", embeddedKotlinVersion)) - classpath("com.android.tools.build:gradle:3.6.0-rc03") + classpath("com.android.tools.build:gradle:3.6.0") classpath("com.github.triplet.gradle:play-publisher:" + file("../version.txt").readText().trim()) }