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.NamedDomainObjectContainer
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.attributes.HasAttributes 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 import org.gradle.api.internal.component.UsageContext
interface KotlinTargetComponent : ComponentWithCoordinates { interface KotlinTargetComponent : SoftwareComponent {
val target: KotlinTarget val target: KotlinTarget
val publishable: Boolean val publishable: Boolean
} }
@@ -106,15 +106,15 @@ class KotlinMultiplatformPlugin(
// Create separate publications for all publishable targets // Create separate publications for all publishable targets
kotlinSoftwareComponent.variants.filter { it.publishable }.forEach { variant -> kotlinSoftwareComponent.variants.filter { it.publishable }.forEach { variant ->
val coordinates = variant.coordinates val coordinates = (variant as? KotlinVariantWithCoordinates)?.coordinates
val name = variant.target.disambiguateName("kotlin") val name = variant.target.disambiguateName("kotlin")
publishing.publications.create(name, MavenPublication::class.java) { publication -> publishing.publications.create(name, MavenPublication::class.java) { publication ->
publication.from(variant) publication.from(variant)
(publication as MavenPublicationInternal).publishWithOriginalFileName() (publication as MavenPublicationInternal).publishWithOriginalFileName()
publication.artifactId = coordinates.name publication.artifactId = coordinates?.name ?: "${project.name}-${variant.target.name.toLowerCase()}"
publication.groupId = coordinates.group publication.groupId = coordinates?.group ?: project.group.toString()
publication.version = coordinates.version 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.AttributeContainer
import org.gradle.api.attributes.Usage import org.gradle.api.attributes.Usage
import org.gradle.api.capabilities.Capability import org.gradle.api.capabilities.Capability
import org.gradle.api.component.ComponentWithCoordinates
import org.gradle.api.component.ComponentWithVariants 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.SoftwareComponentInternal
import org.gradle.api.internal.component.UsageContext import org.gradle.api.internal.component.UsageContext
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
@@ -37,17 +37,9 @@ class KotlinSoftwareComponent(
} }
} }
class KotlinVariant( open class KotlinVariant(
private val project: Project,
override val target: KotlinTarget override val target: KotlinTarget
) : SoftwareComponentInternal, KotlinTargetComponent { ) : 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 getUsages(): Set<UsageContext> = target.createUsageContexts()
override fun getName(): String = target.name override fun getName(): String = target.name
@@ -55,6 +47,28 @@ class KotlinVariant(
get() = target.publishable 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. // At the moment all KN artifacts have JAVA_API usage.
// TODO: Replace it with a specific usage // TODO: Replace it with a specific usage
object NativeUsage { object NativeUsage {
@@ -12,6 +12,7 @@ import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.internal.component.UsageContext import org.gradle.api.internal.component.UsageContext
import org.gradle.api.plugins.JavaPlugin import org.gradle.api.plugins.JavaPlugin
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
@@ -39,7 +40,12 @@ abstract class AbstractKotlinTarget (
override val publishable: Boolean override val publishable: Boolean
get() = true 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> = override fun createUsageContexts(): Set<UsageContext> =
setOf( setOf(