Adjust KPM publication for legacy model publication requirements
This commit is contained in:
+1
@@ -56,6 +56,7 @@ interface KotlinNativeVariant : KotlinGradleVariant {
|
|||||||
|
|
||||||
interface SingleMavenPublishedModuleHolder {
|
interface SingleMavenPublishedModuleHolder {
|
||||||
fun assignMavenPublication(publication: MavenPublication)
|
fun assignMavenPublication(publication: MavenPublication)
|
||||||
|
fun whenPublicationAssigned(handlePublication: (MavenPublication) -> Unit)
|
||||||
val defaultPublishedModuleSuffix: String?
|
val defaultPublishedModuleSuffix: String?
|
||||||
val publishedMavenModuleCoordinates: PublishedModuleCoordinatesProvider
|
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.ConfigurableFileCollection
|
||||||
import org.gradle.api.file.FileCollection
|
import org.gradle.api.file.FileCollection
|
||||||
import org.gradle.api.file.SourceDirectorySet
|
import org.gradle.api.file.SourceDirectorySet
|
||||||
|
import org.gradle.kotlin.dsl.withType
|
||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
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.isMain
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName
|
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName
|
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
|
import org.jetbrains.kotlin.project.model.KotlinModuleFragment
|
||||||
|
|
||||||
internal open class LegacyMappedVariant(
|
internal open class LegacyMappedVariant(
|
||||||
private val compilation: KotlinCompilation<*>,
|
internal val compilation: KotlinCompilation<*>,
|
||||||
) : KotlinGradleVariant {
|
) : KotlinGradleVariant {
|
||||||
private val fragmentForDefaultSourceSet =
|
private val fragmentForDefaultSourceSet =
|
||||||
(compilation.defaultSourceSet as FragmentMappedKotlinSourceSet).underlyingFragment
|
(compilation.defaultSourceSet as FragmentMappedKotlinSourceSet).underlyingFragment
|
||||||
@@ -149,7 +151,11 @@ internal class LegacyMappedVariantWithRuntime(private val compilationWithRuntime
|
|||||||
else project.configurations.maybeCreate(disambiguateName("runtimeElements"))
|
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 ->
|
target.compilations.all { compilation ->
|
||||||
val variant = if (compilation is KotlinCompilationToRunnableFiles)
|
val variant = if (compilation is KotlinCompilationToRunnableFiles)
|
||||||
LegacyMappedVariantWithRuntime(compilation)
|
LegacyMappedVariantWithRuntime(compilation)
|
||||||
@@ -160,17 +166,39 @@ internal fun mapTargetCompilationsToKpmVariants(target: KotlinTarget) {
|
|||||||
|
|
||||||
val module = defaultSourceSetFragment.containingModule
|
val module = defaultSourceSetFragment.containingModule
|
||||||
module.fragments.add(variant)
|
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(
|
VariantPublishingConfigurator.get(target.project).configurePublishing(
|
||||||
variant,
|
variant,
|
||||||
moduleHolder,
|
moduleHolder,
|
||||||
listOfNotNull(
|
configurationNames
|
||||||
// FIXME: use the target's kotlinComponents to build the configurations
|
|
||||||
variant.apiElementsConfiguration.name,
|
|
||||||
if (variant is KotlinGradleVariantWithRuntime) variant.runtimeElementsConfiguration.name else null
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+7
@@ -57,9 +57,16 @@ class DefaultSingleMavenPublishedModuleHolder(
|
|||||||
|
|
||||||
private var assignedMavenPublication: MavenPublication? = null
|
private var assignedMavenPublication: MavenPublication? = null
|
||||||
|
|
||||||
|
private val publicationAssignedHandlers = mutableListOf<(MavenPublication) -> Unit>()
|
||||||
|
|
||||||
override fun assignMavenPublication(publication: MavenPublication) {
|
override fun assignMavenPublication(publication: MavenPublication) {
|
||||||
if (assignedMavenPublication != null) error("already assigned publication $publication")
|
if (assignedMavenPublication != null) error("already assigned publication $publication")
|
||||||
assignedMavenPublication = publication
|
assignedMavenPublication = publication
|
||||||
|
publicationAssignedHandlers.forEach { it(publication) }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun whenPublicationAssigned(handlePublication: (MavenPublication) -> Unit) {
|
||||||
|
assignedMavenPublication?.let(handlePublication) ?: publicationAssignedHandlers.add(handlePublication)
|
||||||
}
|
}
|
||||||
|
|
||||||
override val publishedMavenModuleCoordinates: PublishedModuleCoordinatesProvider = MavenPublicationCoordinatesProvider(
|
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.Project
|
||||||
import org.gradle.api.artifacts.Configuration
|
import org.gradle.api.artifacts.Configuration
|
||||||
import org.gradle.api.artifacts.ModuleDependency
|
import org.gradle.api.artifacts.ModuleDependency
|
||||||
|
import org.gradle.api.artifacts.PublishArtifact
|
||||||
import org.gradle.api.attributes.*
|
import org.gradle.api.attributes.*
|
||||||
import org.gradle.api.capabilities.Capability
|
import org.gradle.api.capabilities.Capability
|
||||||
import org.gradle.api.component.AdhocComponentWithVariants
|
import org.gradle.api.component.AdhocComponentWithVariants
|
||||||
@@ -51,13 +52,11 @@ open class VariantPublishingConfigurator @Inject constructor(
|
|||||||
|
|
||||||
open fun platformComponentName(variant: KotlinGradleVariant) = variant.disambiguateName("")
|
open fun platformComponentName(variant: KotlinGradleVariant) = variant.disambiguateName("")
|
||||||
|
|
||||||
open fun inferMavenScopes(variant: KotlinGradleVariant, configurationNames: Iterable<String>): Map<String, String?> =
|
open fun inferMavenScope(variant: KotlinGradleVariant, configurationName: String): String? =
|
||||||
configurationNames.associateWith { configurationName ->
|
when {
|
||||||
when {
|
configurationName == variant.apiElementsConfiguration.name -> "compile"
|
||||||
configurationName == variant.apiElementsConfiguration.name -> "compile"
|
variant is KotlinGradleVariantWithRuntime && configurationName == variant.runtimeElementsConfiguration.name -> "runtime"
|
||||||
variant is KotlinGradleVariantWithRuntime && configurationName == variant.runtimeElementsConfiguration.name -> "runtime"
|
else -> null
|
||||||
else -> null
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun configurePublishing(
|
open fun configurePublishing(
|
||||||
@@ -66,7 +65,7 @@ open class VariantPublishingConfigurator @Inject constructor(
|
|||||||
publishConfigurations: Iterable<String>
|
publishConfigurations: Iterable<String>
|
||||||
) {
|
) {
|
||||||
val componentName = platformComponentName(variant)
|
val componentName = platformComponentName(variant)
|
||||||
val configurationsMap = inferMavenScopes(variant, publishConfigurations)
|
val configurationsMap = publishConfigurations.associateWith { inferMavenScope(variant, it) }
|
||||||
|
|
||||||
registerPlatformModulePublication(
|
registerPlatformModulePublication(
|
||||||
componentName,
|
componentName,
|
||||||
|
|||||||
+2
-1
@@ -10,6 +10,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp
|
|||||||
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
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.hasKpmModel
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.mapTargetCompilationsToKpmVariants
|
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.mapTargetCompilationsToKpmVariants
|
||||||
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
|
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
|
||||||
@@ -105,7 +106,7 @@ open class KotlinJsTargetPreset(
|
|||||||
override fun createTarget(name: String): KotlinJsTarget {
|
override fun createTarget(name: String): KotlinJsTarget {
|
||||||
val result = super.createTarget(name)
|
val result = super.createTarget(name)
|
||||||
if (project.hasKpmModel) {
|
if (project.hasKpmModel) {
|
||||||
mapTargetCompilationsToKpmVariants(result)
|
mapTargetCompilationsToKpmVariants(result, PublicationRegistrationMode.IMMEDIATE)
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -112,7 +112,7 @@ abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (project.hasKpmModel && !result.isKpm) {
|
if (project.hasKpmModel && !result.isKpm) {
|
||||||
mapTargetCompilationsToKpmVariants(result)
|
mapTargetCompilationsToKpmVariants(result, PublicationRegistrationMode.AFTER_EVALUATE)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
Reference in New Issue
Block a user