Adjust KPM publication for legacy model publication requirements
This commit is contained in:
+1
@@ -56,6 +56,7 @@ interface KotlinNativeVariant : KotlinGradleVariant {
|
||||
|
||||
interface SingleMavenPublishedModuleHolder {
|
||||
fun assignMavenPublication(publication: MavenPublication)
|
||||
fun whenPublicationAssigned(handlePublication: (MavenPublication) -> Unit)
|
||||
val defaultPublishedModuleSuffix: String?
|
||||
val publishedMavenModuleCoordinates: PublishedModuleCoordinatesProvider
|
||||
}
|
||||
|
||||
+37
-9
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+7
@@ -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(
|
||||
|
||||
+7
-8
@@ -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,
|
||||
|
||||
+2
-1
@@ -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
|
||||
}
|
||||
|
||||
+1
-1
@@ -112,7 +112,7 @@ abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>(
|
||||
}
|
||||
|
||||
if (project.hasKpmModel && !result.isKpm) {
|
||||
mapTargetCompilationsToKpmVariants(result)
|
||||
mapTargetCompilationsToKpmVariants(result, PublicationRegistrationMode.AFTER_EVALUATE)
|
||||
}
|
||||
|
||||
return result
|
||||
|
||||
Reference in New Issue
Block a user