Model mapping: rework publications from legacy-mapped variants

Use the publication requests API to express all the details
of a legacy target's publications (artifact & attributes overrides)
This commit is contained in:
Sergey Igushkin
2022-02-01 01:09:53 +04:00
committed by Space
parent 4aeef7169d
commit 388cb96055
5 changed files with 44 additions and 19 deletions
@@ -16,6 +16,7 @@ import org.gradle.api.component.ComponentWithVariants
import org.gradle.api.component.SoftwareComponent
import org.gradle.api.internal.component.SoftwareComponentInternal
import org.gradle.api.internal.component.UsageContext
import org.gradle.api.provider.ListProperty
import org.gradle.api.publish.maven.MavenPublication
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
@@ -27,6 +28,7 @@ import org.jetbrains.kotlin.gradle.targets.metadata.COMMON_MAIN_ELEMENTS_CONFIGU
import org.jetbrains.kotlin.gradle.targets.metadata.KotlinMetadataTargetConfigurator
import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
import org.jetbrains.kotlin.gradle.utils.listProperty
abstract class KotlinSoftwareComponent(
private val project: Project,
@@ -67,7 +69,7 @@ abstract class KotlinSoftwareComponent(
compilation = metadataTarget.compilations.getByName(MAIN_COMPILATION_NAME),
usage = javaApiUsage,
dependencyConfigurationName = metadataTarget.apiElementsConfigurationName,
overrideConfigurationArtifacts = setOf(allMetadataArtifact)
overrideConfigurationArtifacts = project.listProperty { listOf(allMetadataArtifact) }
)
@@ -126,8 +128,8 @@ class DefaultKotlinUsageContext(
override val compilation: KotlinCompilation<*>,
private val usage: Usage,
override val dependencyConfigurationName: String,
private val overrideConfigurationArtifacts: Set<PublishArtifact>? = null,
private val overrideConfigurationAttributes: AttributeContainer? = null,
internal val overrideConfigurationArtifacts: ListProperty<PublishArtifact>? = null,
internal val overrideConfigurationAttributes: AttributeContainer? = null,
override val includeIntoProjectStructureMetadata: Boolean = true
) : KotlinUsageContext {
@@ -148,7 +150,7 @@ class DefaultKotlinUsageContext(
configuration.incoming.dependencyConstraints
override fun getArtifacts(): Set<PublishArtifact> =
overrideConfigurationArtifacts ?:
overrideConfigurationArtifacts?.get()?.toSet() ?:
// TODO Gradle Java plugin does that in a different way; check whether we can improve this
configuration.artifacts
@@ -61,10 +61,20 @@ internal open class LegacyMappedVariant(
}
override val gradleVariantNames: Set<String>
get() = if (compilation.isMain()) {
val apiElements = compilation.target.apiElementsConfigurationName
setOf(apiElements, publishedConfigurationName(apiElements))
} else emptySet()
get() {
val allTargetComponents = (compilation.target as AbstractKotlinTarget).kotlinComponents
val allTargetUsages = allTargetComponents.flatMap {
when (it) {
is KotlinVariant -> it.usages
is JointAndroidKotlinTargetComponent -> it.usages
else -> emptyList()
}
}
val compilationUsages = allTargetUsages.filterIsInstance<DefaultKotlinUsageContext>().filter { it.compilation == compilation }
return compilationUsages.filter { it.includeIntoProjectStructureMetadata }
.flatMap { listOf(it.dependencyConfigurationName, publishedConfigurationName(it.dependencyConfigurationName)) }
.toSet()
}
override val kotlinSourceRoots: SourceDirectorySet
get() = compilation.defaultSourceSet.kotlin
@@ -184,15 +194,11 @@ internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, pu
mainModule,
kotlinComponent.defaultArtifactId.removePrefix(target.project.name.toLowerCase() + "-")
)
val variant = mainModule.variants.withType<LegacyMappedVariant>().single {
it.compilation == target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME)
}
val usages = when (kotlinComponent) { // unfortunately, there's no common supertype with `usages`
is KotlinVariant -> kotlinComponent.usages
is JointAndroidKotlinTargetComponent -> kotlinComponent.usages
else -> error("unexpected type of kotlinComponent in legacy variant mapping: ${kotlinComponent.javaClass}")
}
val configurations = usages.map { target.project.configurations.getByName(it.dependencyConfigurationName) }
// Include Sources
moduleHolder.whenPublicationAssigned { publication ->
@@ -201,14 +207,28 @@ internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, pu
}
}
// FIXME: apply overrides for attributes and artifacts from the DefaultKotlinUsageContext!
// FIXME: include additional variants into project structure metadata?
VariantPublishingConfigurator.get(target.project).configureSingleVariantPublishing(
variant,
val request = BasicPlatformPublicationToMavenRequest(
kotlinComponent.name,
mainModule,
moduleHolder,
configurations
usages.map { usage ->
val variant = mainModule.variants.withType<LegacyMappedVariant>().single {
it.compilation == usage.compilation
}
(usage as? DefaultKotlinUsageContext) ?: error("unexpected KotlinUsageContext type: ${usage.javaClass}")
AdvancedVariantPublicationRequest(
variant,
target.project.configurations.getByName(usage.dependencyConfigurationName),
usage.overrideConfigurationAttributes,
usage.overrideConfigurationArtifacts,
usage.includeIntoProjectStructureMetadata
)
}
)
VariantPublishingConfigurator.get(target.project).configurePublishing(request)
}
}
}
@@ -15,6 +15,7 @@ import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.Usage.JAVA_RUNTIME_JARS
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
import org.jetbrains.kotlin.gradle.utils.listProperty
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
open class KotlinAndroidTarget(
@@ -205,7 +206,7 @@ open class KotlinAndroidTarget(
compilation,
project.usageByName(usageName),
dependencyConfigurationName,
overrideConfigurationArtifacts = setOf(artifact),
overrideConfigurationArtifacts = project.listProperty { listOf(artifact) },
overrideConfigurationAttributes = HierarchyAttributeContainer(configuration.attributes) {
val valueString = run {
val value = configuration.attributes.getAttribute(it)
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.gradle.tasks.locateTask
import org.jetbrains.kotlin.gradle.testing.internal.KotlinTestReport
import org.jetbrains.kotlin.gradle.testing.testTaskName
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
import org.jetbrains.kotlin.gradle.utils.listProperty
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import javax.inject.Inject
@@ -101,7 +102,7 @@ constructor(
compilation = compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME),
usage = project.usageByName("java-api-jars"),
dependencyConfigurationName = commonFakeApiElementsConfigurationName,
overrideConfigurationArtifacts = emptySet()
overrideConfigurationArtifacts = project.listProperty { emptyList() }
)
}
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.listProperty
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import javax.inject.Inject
@@ -67,7 +68,7 @@ constructor(
compilation = compilations.getByName(MAIN_COMPILATION_NAME),
usage = project.usageByName("java-api-jars"),
dependencyConfigurationName = commonFakeApiElementsConfigurationName,
overrideConfigurationArtifacts = emptySet()
overrideConfigurationArtifacts = project.listProperty { emptyList() }
)
}