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:
committed by
Ilya Matveev
parent
091e680196
commit
67bd659390
+2
-2
@@ -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
|
||||
}
|
||||
|
||||
+4
-4
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+24
-10
@@ -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 {
|
||||
|
||||
+7
-1
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user