[Gradle] Support sources publication as variants in ExternalKotlinTarget

^KT-36943
This commit is contained in:
Anton Lakotka
2022-11-29 14:57:51 +01:00
committed by teamcity
parent b7dff37734
commit 032c3330ab
5 changed files with 55 additions and 0 deletions
@@ -68,6 +68,15 @@ fun KotlinMultiplatformExtension.androidTargetPrototype(): PrototypeAndroidTarge
configuration.attributes.attribute(AgpVersionAttr.ATTRIBUTE, project.objects.named("7.4.0-beta02")) /* For demo */
}
/*
Configure runtimeElements configuration attributes (project to project dependency)
In this example we hardcoded AGP version 7.4.0-beta02 as demo
*/
sourcesElements.configure { _, configuration ->
configuration.attributes.attribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, project.objects.named(TargetJvmEnvironment.ANDROID))
configuration.attributes.attribute(AgpVersionAttr.ATTRIBUTE, project.objects.named("7.4.0-beta02")) /* For demo */
}
/*
Configure published configurations (maven publication):
We override KotlinPlatformType to be androidJvm for now (to be discussed w/ Google later)
@@ -84,6 +93,12 @@ fun KotlinMultiplatformExtension.androidTargetPrototype(): PrototypeAndroidTarge
configuration.attributes.attribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, project.objects.named(TargetJvmEnvironment.ANDROID))
}
sourcesElementsPublished.configure { _, configuration ->
/* TODO w/ Google: Find a way to deprecate this attribute */
configuration.attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.androidJvm)
configuration.attributes.attribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, project.objects.named(TargetJvmEnvironment.ANDROID))
}
configureIdeImport {
registerDependencyResolver(
AndroidBootClasspathIdeDependencyResolver(project),
@@ -47,6 +47,11 @@ internal class ExternalKotlinTargetComponent(
override val defaultArtifactId: String
get() = dashSeparatedName(target.project.name, target.name.toLowerCase())
@Deprecated(
message = "Sources artifacts are now published as separate variant " +
"use target.sourcesElementsConfigurationName to obtain necessary information",
replaceWith = ReplaceWith("target.sourcesElementsConfigurationName")
)
override val sourcesArtifacts: Set<PublishArtifact>
get() = emptySet()
@@ -24,8 +24,10 @@ interface ExternalKotlinTargetDescriptor<T : DecoratedExternalKotlinTarget> {
val apiElements: ExternalKotlinTargetConfigurationDescriptor<T>
val runtimeElements: ExternalKotlinTargetConfigurationDescriptor<T>
val sourcesElements: ExternalKotlinTargetConfigurationDescriptor<T>
val apiElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>
val runtimeElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>
val sourcesElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>
val configure: ((T) -> Unit)?
val configureIdeImport: (IdeMultiplatformImport.() -> Unit)?
@@ -50,12 +52,18 @@ class ExternalKotlinTargetDescriptorBuilder<T : DecoratedExternalKotlinTarget> i
val runtimeElements: ExternalKotlinTargetConfigurationDescriptorBuilder<T> =
ExternalKotlinTargetConfigurationDescriptorBuilder()
val sourcesElements: ExternalKotlinTargetConfigurationDescriptorBuilder<T> =
ExternalKotlinTargetConfigurationDescriptorBuilder()
val apiElementsPublished: ExternalKotlinTargetConfigurationDescriptorBuilder<T> =
ExternalKotlinTargetConfigurationDescriptorBuilder()
val runtimeElementsPublished: ExternalKotlinTargetConfigurationDescriptorBuilder<T> =
ExternalKotlinTargetConfigurationDescriptorBuilder()
val sourcesElementsPublished: ExternalKotlinTargetConfigurationDescriptorBuilder<T> =
ExternalKotlinTargetConfigurationDescriptorBuilder()
var configure: ((T) -> Unit)? = null
fun configure(action: (T) -> Unit) {
@@ -78,8 +86,10 @@ class ExternalKotlinTargetDescriptorBuilder<T : DecoratedExternalKotlinTarget> i
targetFactory = targetFactory,
apiElements = apiElements.build(),
runtimeElements = runtimeElements.build(),
sourcesElements = sourcesElements.build(),
apiElementsPublished = apiElementsPublished.build(),
runtimeElementsPublished = runtimeElementsPublished.build(),
sourcesElementsPublished = sourcesElementsPublished.build(),
configure = configure,
configureIdeImport = configureIdeImport
)
@@ -91,8 +101,10 @@ private data class ExternalKotlinTargetDescriptorImpl<T : DecoratedExternalKotli
override val targetFactory: TargetFactory<T>,
override val apiElements: ExternalKotlinTargetConfigurationDescriptor<T>,
override val runtimeElements: ExternalKotlinTargetConfigurationDescriptor<T>,
override val sourcesElements: ExternalKotlinTargetConfigurationDescriptor<T>,
override val apiElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>,
override val runtimeElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>,
override val sourcesElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>,
override val configure: ((T) -> Unit)?,
override val configureIdeImport: (IdeMultiplatformImport.() -> Unit)?,
) : ExternalKotlinTargetDescriptor<T>
@@ -28,8 +28,10 @@ internal class ExternalKotlinTargetImpl internal constructor(
val defaultConfiguration: Configuration,
val apiElementsConfiguration: Configuration,
val runtimeElementsConfiguration: Configuration,
val sourcesElementsConfiguration: Configuration,
val apiElementsPublishedConfiguration: Configuration,
val runtimeElementsPublishedConfiguration: Configuration,
val sourcesElementsPublishedConfiguration: Configuration,
val kotlinTargetComponent: ExternalKotlinTargetComponent,
private val artifactsTaskLocator: ArtifactsTaskLocator,
) : InternalKotlinTarget {
@@ -65,6 +67,9 @@ internal class ExternalKotlinTargetImpl internal constructor(
override val runtimeElementsConfigurationName: String
get() = runtimeElementsConfiguration.name
override val sourcesElementsConfigurationName: String
get() = sourcesElementsConfiguration.name
@InternalKotlinGradlePluginApi
override val kotlinComponents: Set<KotlinTargetComponent> = setOf(kotlinTargetComponent)
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.gradle.ExternalKotlinTargetApi
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.ide.kotlinIdeMultiplatformImport
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.plugin.mpp.configureSourcesPublicationAttributes
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.markConsumable
import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
@@ -28,6 +29,7 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
val defaultConfiguration = project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "default"))
val apiElementsConfiguration = project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "apiElements"))
val runtimeElementsConfiguration = project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "runtimeElements"))
val sourcesElementsConfiguration = project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "sourcesElements"))
val apiElementsPublishedConfiguration =
project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "apiElements-published"))
@@ -35,6 +37,9 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
val runtimeElementsPublishedConfiguration =
project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "runtimeElements-published"))
val sourcesElementsPublishedConfiguration =
project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "sourcesElements-published"))
val kotlinTargetComponent = ExternalKotlinTargetComponent(
ExternalKotlinTargetComponent.TargetProvider.byTargetName(this, descriptor.targetName)
)
@@ -51,8 +56,10 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
defaultConfiguration = defaultConfiguration,
apiElementsConfiguration = apiElementsConfiguration,
runtimeElementsConfiguration = runtimeElementsConfiguration,
sourcesElementsConfiguration = sourcesElementsConfiguration,
apiElementsPublishedConfiguration = apiElementsPublishedConfiguration,
runtimeElementsPublishedConfiguration = runtimeElementsPublishedConfiguration,
sourcesElementsPublishedConfiguration = sourcesElementsPublishedConfiguration,
kotlinTargetComponent = kotlinTargetComponent,
artifactsTaskLocator = artifactsTaskLocator
)
@@ -61,14 +68,19 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
target.setupApiElements(apiElementsPublishedConfiguration)
target.setupRuntimeElements(runtimeElementsConfiguration)
target.setupRuntimeElements(runtimeElementsPublishedConfiguration)
target.setupSourcesElements(sourcesElementsConfiguration)
target.setupSourcesElements(sourcesElementsPublishedConfiguration)
apiElementsConfiguration.markConsumable()
runtimeElementsConfiguration.markConsumable()
sourcesElementsConfiguration.markConsumable()
/* Those configurations can not be resolved but also not consumed (not suitable for project to proejct dependencies */
apiElementsPublishedConfiguration.isCanBeConsumed = false
apiElementsPublishedConfiguration.isCanBeResolved = false
runtimeElementsPublishedConfiguration.isCanBeResolved = false
runtimeElementsPublishedConfiguration.isCanBeConsumed = false
sourcesElementsPublishedConfiguration.isCanBeResolved = false
sourcesElementsPublishedConfiguration.isCanBeConsumed = false
val decorated = descriptor.targetFactory.create(DecoratedExternalKotlinTarget.Delegate(target))
target.onCreated()
@@ -76,8 +88,10 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
descriptor.configure?.invoke(decorated)
descriptor.apiElements.configure?.invoke(decorated, apiElementsConfiguration)
descriptor.runtimeElements.configure?.invoke(decorated, runtimeElementsConfiguration)
descriptor.sourcesElements.configure?.invoke(decorated, sourcesElementsConfiguration)
descriptor.apiElementsPublished.configure?.invoke(decorated, apiElementsPublishedConfiguration)
descriptor.runtimeElementsPublished.configure?.invoke(decorated, runtimeElementsPublishedConfiguration)
descriptor.sourcesElementsPublished.configure?.invoke(decorated, sourcesElementsPublishedConfiguration)
descriptor.configureIdeImport?.invoke(project.kotlinIdeMultiplatformImport)
targets.add(decorated)
@@ -103,3 +117,7 @@ private fun ExternalKotlinTargetImpl.setupRuntimeElements(configuration: Configu
configuration.attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerRuntimeUsage(this))
configuration.attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.LIBRARY))
}
private fun ExternalKotlinTargetImpl.setupSourcesElements(configuration: Configuration) {
configuration.configureSourcesPublicationAttributes(this)
}