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.
This commit is contained in:
Sergey Igushkin
2018-08-23 19:05:56 +03:00
committed by Ilya Matveev
parent 091e680196
commit 67bd659390
4 changed files with 37 additions and 17 deletions
@@ -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
}
@@ -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()
}
}
}
@@ -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<UsageContext> = 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 {
@@ -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<UsageContext> =
setOf(