Adjust KPM publication for legacy model publication requirements

This commit is contained in:
Sergey Igushkin
2022-01-13 17:22:08 +04:00
committed by Space
parent 42fa23398b
commit 8676685ebc
6 changed files with 55 additions and 19 deletions
@@ -56,6 +56,7 @@ interface KotlinNativeVariant : KotlinGradleVariant {
interface SingleMavenPublishedModuleHolder {
fun assignMavenPublication(publication: MavenPublication)
fun whenPublicationAssigned(handlePublication: (MavenPublication) -> Unit)
val defaultPublishedModuleSuffix: String?
val publishedMavenModuleCoordinates: PublishedModuleCoordinatesProvider
}
@@ -16,7 +16,9 @@ import org.gradle.api.artifacts.Configuration
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.FileCollection
import org.gradle.api.file.SourceDirectorySet
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.isMain
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName
import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName
@@ -27,7 +29,7 @@ import org.jetbrains.kotlin.project.model.KotlinModuleDependency
import org.jetbrains.kotlin.project.model.KotlinModuleFragment
internal open class LegacyMappedVariant(
private val compilation: KotlinCompilation<*>,
internal val compilation: KotlinCompilation<*>,
) : KotlinGradleVariant {
private val fragmentForDefaultSourceSet =
(compilation.defaultSourceSet as FragmentMappedKotlinSourceSet).underlyingFragment
@@ -149,7 +151,11 @@ internal class LegacyMappedVariantWithRuntime(private val compilationWithRuntime
else project.configurations.maybeCreate(disambiguateName("runtimeElements"))
}
internal fun mapTargetCompilationsToKpmVariants(target: KotlinTarget) {
internal enum class PublicationRegistrationMode {
IMMEDIATE, AFTER_EVALUATE
}
internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, publicationRegistration: PublicationRegistrationMode) {
target.compilations.all { compilation ->
val variant = if (compilation is KotlinCompilationToRunnableFiles)
LegacyMappedVariantWithRuntime(compilation)
@@ -160,17 +166,39 @@ internal fun mapTargetCompilationsToKpmVariants(target: KotlinTarget) {
val module = defaultSourceSetFragment.containingModule
module.fragments.add(variant)
}
val whenPublicationShouldRegister: (() -> Unit) -> Unit = when (publicationRegistration) {
PublicationRegistrationMode.IMMEDIATE -> ::run
PublicationRegistrationMode.AFTER_EVALUATE -> {
{ target.project.whenEvaluated { it() } }
}
}
whenPublicationShouldRegister {
val mainModule = target.project.kpmModules.getByName(KotlinGradleModule.MAIN_MODULE_NAME)
target.kotlinComponents.forEach { kotlinComponent ->
val moduleHolder = DefaultSingleMavenPublishedModuleHolder(
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 configurationNames = usages.map { it.dependencyConfigurationName }
// FIXME: apply overrides for attributes and artifacts from the DefaultKotlinUsageContext!
// FIXME: include additional variants into project structure metadata?
if (compilation.isMain()) {
val moduleHolder = DefaultSingleMavenPublishedModuleHolder(module, target.name)
VariantPublishingConfigurator.get(target.project).configurePublishing(
variant,
moduleHolder,
listOfNotNull(
// FIXME: use the target's kotlinComponents to build the configurations
variant.apiElementsConfiguration.name,
if (variant is KotlinGradleVariantWithRuntime) variant.runtimeElementsConfiguration.name else null
)
configurationNames
)
}
}
@@ -57,9 +57,16 @@ class DefaultSingleMavenPublishedModuleHolder(
private var assignedMavenPublication: MavenPublication? = null
private val publicationAssignedHandlers = mutableListOf<(MavenPublication) -> Unit>()
override fun assignMavenPublication(publication: MavenPublication) {
if (assignedMavenPublication != null) error("already assigned publication $publication")
assignedMavenPublication = publication
publicationAssignedHandlers.forEach { it(publication) }
}
override fun whenPublicationAssigned(handlePublication: (MavenPublication) -> Unit) {
assignedMavenPublication?.let(handlePublication) ?: publicationAssignedHandlers.add(handlePublication)
}
override val publishedMavenModuleCoordinates: PublishedModuleCoordinatesProvider = MavenPublicationCoordinatesProvider(
@@ -9,6 +9,7 @@ import com.android.build.gradle.internal.publishing.AndroidArtifacts
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ModuleDependency
import org.gradle.api.artifacts.PublishArtifact
import org.gradle.api.attributes.*
import org.gradle.api.capabilities.Capability
import org.gradle.api.component.AdhocComponentWithVariants
@@ -51,13 +52,11 @@ open class VariantPublishingConfigurator @Inject constructor(
open fun platformComponentName(variant: KotlinGradleVariant) = variant.disambiguateName("")
open fun inferMavenScopes(variant: KotlinGradleVariant, configurationNames: Iterable<String>): Map<String, String?> =
configurationNames.associateWith { configurationName ->
when {
configurationName == variant.apiElementsConfiguration.name -> "compile"
variant is KotlinGradleVariantWithRuntime && configurationName == variant.runtimeElementsConfiguration.name -> "runtime"
else -> null
}
open fun inferMavenScope(variant: KotlinGradleVariant, configurationName: String): String? =
when {
configurationName == variant.apiElementsConfiguration.name -> "compile"
variant is KotlinGradleVariantWithRuntime && configurationName == variant.runtimeElementsConfiguration.name -> "runtime"
else -> null
}
open fun configurePublishing(
@@ -66,7 +65,7 @@ open class VariantPublishingConfigurator @Inject constructor(
publishConfigurations: Iterable<String>
) {
val componentName = platformComponentName(variant)
val configurationsMap = inferMavenScopes(variant, publishConfigurations)
val configurationsMap = publishConfigurations.associateWith { inferMavenScope(variant, it) }
registerPlatformModulePublication(
componentName,
@@ -10,6 +10,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.PublicationRegistrationMode
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.mapTargetCompilationsToKpmVariants
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
@@ -105,7 +106,7 @@ open class KotlinJsTargetPreset(
override fun createTarget(name: String): KotlinJsTarget {
val result = super.createTarget(name)
if (project.hasKpmModel) {
mapTargetCompilationsToKpmVariants(result)
mapTargetCompilationsToKpmVariants(result, PublicationRegistrationMode.IMMEDIATE)
}
return result
}
@@ -112,7 +112,7 @@ abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>(
}
if (project.hasKpmModel && !result.isKpm) {
mapTargetCompilationsToKpmVariants(result)
mapTargetCompilationsToKpmVariants(result, PublicationRegistrationMode.AFTER_EVALUATE)
}
return result