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:
+6
-4
@@ -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
|
||||
|
||||
|
||||
+32
-12
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -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)
|
||||
|
||||
+2
-1
@@ -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() }
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -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() }
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user