[Gradle] Make sure that rootSoftwareComponent is always added

Even when createDefaultMultiplatformPublications=false and maven-publish
is applied it is required to create all publication-specific entities
such as tasks, configurations, components etc. In order to let users
to compose publications on their own.

^KT-62877 Verification Pending
This commit is contained in:
Anton Lakotka
2023-10-27 11:32:00 +02:00
committed by Space Team
parent d3f25d81de
commit b154283149
2 changed files with 48 additions and 8 deletions
@@ -38,15 +38,14 @@ internal val Project.kotlinMultiplatformRootPublication: Future<MavenPublication
get() = kotlinMultiplatformRootPublicationImpl
internal val MultiplatformPublishingSetupAction = KotlinProjectSetupCoroutine {
if (!project.kotlinPropertiesProvider.createDefaultMultiplatformPublications) {
kotlinMultiplatformRootPublicationImpl.complete(null)
return@KotlinProjectSetupCoroutine
}
if (isPluginApplied("maven-publish")) {
project.extensions.configure(PublishingExtension::class.java) { publishing ->
createRootPublication(project, publishing).also(kotlinMultiplatformRootPublicationImpl::complete)
createTargetPublications(project, publishing)
if (project.kotlinPropertiesProvider.createDefaultMultiplatformPublications) {
project.extensions.configure(PublishingExtension::class.java) { publishing ->
createRootPublication(project, publishing).also(kotlinMultiplatformRootPublicationImpl::complete)
createTargetPublications(project, publishing)
}
} else {
kotlinMultiplatformRootPublicationImpl.complete(null)
}
project.components.add(project.multiplatformExtension.rootSoftwareComponent)
} else {
@@ -19,6 +19,7 @@ import org.gradle.api.publish.maven.MavenPublication
import org.gradle.testfixtures.ProjectBuilder
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.internal
import org.jetbrains.kotlin.gradle.util.*
import org.jetbrains.kotlin.gradle.util.addBuildEventsListenerRegistryMock
import org.jetbrains.kotlin.gradle.util.disableLegacyWarning
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
@@ -227,6 +228,46 @@ class MppPublicationTest {
}
}
@Test
fun `test creation of default publications can be disabled`() {
val project = buildProject { }
project.propertiesExtension.set("kotlin.internal.mpp.createDefaultMultiplatformPublications", "false")
project.plugins.apply("kotlin-multiplatform")
project.plugins.apply("maven-publish")
project.kotlin {
jvm()
linuxArm64()
}
project.evaluate()
val publishing = project.extensions.getByType(PublishingExtension::class.java)
val actualPublications = publishing.publications.names
if (actualPublications.isNotEmpty()) fail("Expected no default publications to be created")
// Even though creation of default publications are disabled
// it is still important that components and everything else needed for publishing are still present
val components = project.components.names
assertEquals(setOf("kotlin"), components)
val expectedSourcesJarTasks = setOf("sourcesJar", "metadataSourcesJar", "jvmSourcesJar", "linuxArm64SourcesJar")
val missingSourcesJarTasks = expectedSourcesJarTasks - project.tasks.names
if (missingSourcesJarTasks.isNotEmpty()) fail("Following sources jar tasks are not created: $missingSourcesJarTasks")
val expectedConfigurations = setOf(
"jvmApiElements",
"jvmApiElements-published",
"jvmRuntimeElements",
"jvmRuntimeElements-published",
"jvmSourcesElements",
"jvmSourcesElements-published",
"metadataApiElements",
)
val missingConfigurations = expectedConfigurations - project.configurations.names
if (missingConfigurations.isNotEmpty()) fail("Following configurations are not created: $missingConfigurations")
}
private fun SoftwareComponent.attributesOfUsageContext(usageContextName: String): AttributeContainer {
this as SoftwareComponentInternal
return usages.first { it.name == usageContextName }.attributes