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.component.SoftwareComponent
|
||||||
import org.gradle.api.internal.component.SoftwareComponentInternal
|
import org.gradle.api.internal.component.SoftwareComponentInternal
|
||||||
import org.gradle.api.internal.component.UsageContext
|
import org.gradle.api.internal.component.UsageContext
|
||||||
|
import org.gradle.api.provider.ListProperty
|
||||||
import org.gradle.api.publish.maven.MavenPublication
|
import org.gradle.api.publish.maven.MavenPublication
|
||||||
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
|
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
|
||||||
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
|
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.KotlinMetadataTargetConfigurator
|
||||||
import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled
|
import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled
|
||||||
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
|
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.listProperty
|
||||||
|
|
||||||
abstract class KotlinSoftwareComponent(
|
abstract class KotlinSoftwareComponent(
|
||||||
private val project: Project,
|
private val project: Project,
|
||||||
@@ -67,7 +69,7 @@ abstract class KotlinSoftwareComponent(
|
|||||||
compilation = metadataTarget.compilations.getByName(MAIN_COMPILATION_NAME),
|
compilation = metadataTarget.compilations.getByName(MAIN_COMPILATION_NAME),
|
||||||
usage = javaApiUsage,
|
usage = javaApiUsage,
|
||||||
dependencyConfigurationName = metadataTarget.apiElementsConfigurationName,
|
dependencyConfigurationName = metadataTarget.apiElementsConfigurationName,
|
||||||
overrideConfigurationArtifacts = setOf(allMetadataArtifact)
|
overrideConfigurationArtifacts = project.listProperty { listOf(allMetadataArtifact) }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -126,8 +128,8 @@ class DefaultKotlinUsageContext(
|
|||||||
override val compilation: KotlinCompilation<*>,
|
override val compilation: KotlinCompilation<*>,
|
||||||
private val usage: Usage,
|
private val usage: Usage,
|
||||||
override val dependencyConfigurationName: String,
|
override val dependencyConfigurationName: String,
|
||||||
private val overrideConfigurationArtifacts: Set<PublishArtifact>? = null,
|
internal val overrideConfigurationArtifacts: ListProperty<PublishArtifact>? = null,
|
||||||
private val overrideConfigurationAttributes: AttributeContainer? = null,
|
internal val overrideConfigurationAttributes: AttributeContainer? = null,
|
||||||
override val includeIntoProjectStructureMetadata: Boolean = true
|
override val includeIntoProjectStructureMetadata: Boolean = true
|
||||||
) : KotlinUsageContext {
|
) : KotlinUsageContext {
|
||||||
|
|
||||||
@@ -148,7 +150,7 @@ class DefaultKotlinUsageContext(
|
|||||||
configuration.incoming.dependencyConstraints
|
configuration.incoming.dependencyConstraints
|
||||||
|
|
||||||
override fun getArtifacts(): Set<PublishArtifact> =
|
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
|
// TODO Gradle Java plugin does that in a different way; check whether we can improve this
|
||||||
configuration.artifacts
|
configuration.artifacts
|
||||||
|
|
||||||
|
|||||||
+32
-12
@@ -61,10 +61,20 @@ internal open class LegacyMappedVariant(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override val gradleVariantNames: Set<String>
|
override val gradleVariantNames: Set<String>
|
||||||
get() = if (compilation.isMain()) {
|
get() {
|
||||||
val apiElements = compilation.target.apiElementsConfigurationName
|
val allTargetComponents = (compilation.target as AbstractKotlinTarget).kotlinComponents
|
||||||
setOf(apiElements, publishedConfigurationName(apiElements))
|
val allTargetUsages = allTargetComponents.flatMap {
|
||||||
} else emptySet()
|
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
|
override val kotlinSourceRoots: SourceDirectorySet
|
||||||
get() = compilation.defaultSourceSet.kotlin
|
get() = compilation.defaultSourceSet.kotlin
|
||||||
@@ -184,15 +194,11 @@ internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, pu
|
|||||||
mainModule,
|
mainModule,
|
||||||
kotlinComponent.defaultArtifactId.removePrefix(target.project.name.toLowerCase() + "-")
|
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`
|
val usages = when (kotlinComponent) { // unfortunately, there's no common supertype with `usages`
|
||||||
is KotlinVariant -> kotlinComponent.usages
|
is KotlinVariant -> kotlinComponent.usages
|
||||||
is JointAndroidKotlinTargetComponent -> kotlinComponent.usages
|
is JointAndroidKotlinTargetComponent -> kotlinComponent.usages
|
||||||
else -> error("unexpected type of kotlinComponent in legacy variant mapping: ${kotlinComponent.javaClass}")
|
else -> error("unexpected type of kotlinComponent in legacy variant mapping: ${kotlinComponent.javaClass}")
|
||||||
}
|
}
|
||||||
val configurations = usages.map { target.project.configurations.getByName(it.dependencyConfigurationName) }
|
|
||||||
|
|
||||||
// Include Sources
|
// Include Sources
|
||||||
moduleHolder.whenPublicationAssigned { publication ->
|
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?
|
// FIXME: include additional variants into project structure metadata?
|
||||||
|
|
||||||
VariantPublishingConfigurator.get(target.project).configureSingleVariantPublishing(
|
val request = BasicPlatformPublicationToMavenRequest(
|
||||||
variant,
|
kotlinComponent.name,
|
||||||
|
mainModule,
|
||||||
moduleHolder,
|
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.gradle.api.attributes.Usage.JAVA_RUNTIME_JARS
|
||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
import org.jetbrains.kotlin.gradle.plugin.*
|
||||||
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
|
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.listProperty
|
||||||
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
|
|
||||||
open class KotlinAndroidTarget(
|
open class KotlinAndroidTarget(
|
||||||
@@ -205,7 +206,7 @@ open class KotlinAndroidTarget(
|
|||||||
compilation,
|
compilation,
|
||||||
project.usageByName(usageName),
|
project.usageByName(usageName),
|
||||||
dependencyConfigurationName,
|
dependencyConfigurationName,
|
||||||
overrideConfigurationArtifacts = setOf(artifact),
|
overrideConfigurationArtifacts = project.listProperty { listOf(artifact) },
|
||||||
overrideConfigurationAttributes = HierarchyAttributeContainer(configuration.attributes) {
|
overrideConfigurationAttributes = HierarchyAttributeContainer(configuration.attributes) {
|
||||||
val valueString = run {
|
val valueString = run {
|
||||||
val value = configuration.attributes.getAttribute(it)
|
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.internal.KotlinTestReport
|
||||||
import org.jetbrains.kotlin.gradle.testing.testTaskName
|
import org.jetbrains.kotlin.gradle.testing.testTaskName
|
||||||
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
|
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.listProperty
|
||||||
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@@ -101,7 +102,7 @@ constructor(
|
|||||||
compilation = compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME),
|
compilation = compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME),
|
||||||
usage = project.usageByName("java-api-jars"),
|
usage = project.usageByName("java-api-jars"),
|
||||||
dependencyConfigurationName = commonFakeApiElementsConfigurationName,
|
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.targets.js.npm.npmProject
|
||||||
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
|
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
|
||||||
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.listProperty
|
||||||
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@@ -67,7 +68,7 @@ constructor(
|
|||||||
compilation = compilations.getByName(MAIN_COMPILATION_NAME),
|
compilation = compilations.getByName(MAIN_COMPILATION_NAME),
|
||||||
usage = project.usageByName("java-api-jars"),
|
usage = project.usageByName("java-api-jars"),
|
||||||
dependencyConfigurationName = commonFakeApiElementsConfigurationName,
|
dependencyConfigurationName = commonFakeApiElementsConfigurationName,
|
||||||
overrideConfigurationArtifacts = emptySet()
|
overrideConfigurationArtifacts = project.listProperty { emptyList() }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user