From 67bd65939019fbea58da27c974eaf0d302811e32 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Thu, 23 Aug 2018 19:05:56 +0300 Subject: [PATCH] Fallback to publishing with coordinates inferred from publication In Gradle < 4.7, there's no `ComponentWithCoordinates` interface, and we need to make sure that none of our classes implementing this interface are loaded with older Gradle versions. Instead of that interface, we can rely on Gradle's metadata generation heuristic that takes Maven coordinates for the variants from the corresponding publications. --- .../kotlin/gradle/plugin/KotlinTarget.kt | 4 +-- .../plugin/mpp/KotlinMultiplatformPlugin.kt | 8 ++--- .../plugin/mpp/KotlinSoftwareComponent.kt | 34 +++++++++++++------ .../kotlin/gradle/plugin/mpp/kotlinTargets.kt | 8 ++++- 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTarget.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTarget.kt index cb71c6f1cbe..3ce3517beed 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTarget.kt @@ -9,10 +9,10 @@ import org.gradle.api.Named import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project import org.gradle.api.attributes.HasAttributes -import org.gradle.api.component.ComponentWithCoordinates +import org.gradle.api.component.SoftwareComponent import org.gradle.api.internal.component.UsageContext -interface KotlinTargetComponent : ComponentWithCoordinates { +interface KotlinTargetComponent : SoftwareComponent { val target: KotlinTarget val publishable: Boolean } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index 704428ba331..d9a2d2ffa45 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -106,15 +106,15 @@ class KotlinMultiplatformPlugin( // Create separate publications for all publishable targets kotlinSoftwareComponent.variants.filter { it.publishable }.forEach { variant -> - val coordinates = variant.coordinates + val coordinates = (variant as? KotlinVariantWithCoordinates)?.coordinates val name = variant.target.disambiguateName("kotlin") publishing.publications.create(name, MavenPublication::class.java) { publication -> publication.from(variant) (publication as MavenPublicationInternal).publishWithOriginalFileName() - publication.artifactId = coordinates.name - publication.groupId = coordinates.group - publication.version = coordinates.version + publication.artifactId = coordinates?.name ?: "${project.name}-${variant.target.name.toLowerCase()}" + publication.groupId = coordinates?.group ?: project.group.toString() + publication.version = coordinates?.version ?: project.version.toString() } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt index 156a371c1ef..8af00837f68 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt @@ -10,8 +10,8 @@ import org.gradle.api.artifacts.* import org.gradle.api.attributes.AttributeContainer import org.gradle.api.attributes.Usage import org.gradle.api.capabilities.Capability +import org.gradle.api.component.ComponentWithCoordinates import org.gradle.api.component.ComponentWithVariants -import org.gradle.api.internal.artifacts.DefaultModuleVersionIdentifier import org.gradle.api.internal.component.SoftwareComponentInternal import org.gradle.api.internal.component.UsageContext import org.jetbrains.kotlin.gradle.plugin.KotlinTarget @@ -37,17 +37,9 @@ class KotlinSoftwareComponent( } } -class KotlinVariant( - private val project: Project, +open class KotlinVariant( override val target: KotlinTarget ) : SoftwareComponentInternal, KotlinTargetComponent { - - override fun getCoordinates() = DefaultModuleVersionIdentifier( - project.group.toString(), - "${project.name}-${target.name.toLowerCase()}", - project.version.toString() - ) - override fun getUsages(): Set = target.createUsageContexts() override fun getName(): String = target.name @@ -55,6 +47,28 @@ class KotlinVariant( get() = target.publishable } +class KotlinVariantWithCoordinates( + target: KotlinTarget +) : KotlinVariant(target), + ComponentWithCoordinates /* Gradle 4.7+ API, don't use with older versions */ +{ + override fun getCoordinates() = object : ModuleVersionIdentifier { + private val project get() = target.project + + private val moduleName: String get() = "${project.name}-${target.name.toLowerCase()}" + private val moduleGroup: String get() = project.group.toString() + + override fun getGroup() = moduleGroup + override fun getName() = moduleName + override fun getVersion() = project.version.toString() + + override fun getModule(): ModuleIdentifier = object : ModuleIdentifier { + override fun getGroup(): String = moduleGroup + override fun getName(): String = moduleName + } + } +} + // At the moment all KN artifacts have JAVA_API usage. // TODO: Replace it with a specific usage object NativeUsage { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt index 0518cb8b871..76e3ebadf3c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt @@ -12,6 +12,7 @@ import org.gradle.api.attributes.AttributeContainer import org.gradle.api.internal.component.UsageContext import org.gradle.api.plugins.JavaPlugin import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.konan.target.KonanTarget @@ -39,7 +40,12 @@ abstract class AbstractKotlinTarget ( override val publishable: Boolean get() = true - override val component: KotlinTargetComponent = KotlinVariant(project, this) + override val component: KotlinTargetComponent by lazy { + if (isGradleVersionAtLeast(4, 7)) + KotlinVariantWithCoordinates(this) + else + KotlinVariant(this) + } override fun createUsageContexts(): Set = setOf(