Add sourcesJar from metadata target to root multiplatform publication
^KT-44298 fixed
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt
index c9027e8..e9cc1e7 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt
@@ -266,6 +266,19 @@
assertEquals(expectedProjectStructureMetadata, parsedProjectStructureMetadata)
}
+
+ ZipFile(
+ project.projectDir.parentFile.resolve(
+ "repo/com/example/foo/my-lib-foo/1.0/my-lib-foo-1.0-sources.jar"
+ )
+ ).use { publishedSourcesJar ->
+ publishedSourcesJar.checkAllEntryNamesArePresent(
+ "commonMain/Foo.kt",
+ "jvmAndJsMain/FooJvmAndJs.kt",
+ "linuxAndJsMain/FooLinuxAndJs.kt",
+ "linuxX64Main/FooLinux.kt"
+ )
+ }
}
private fun checkMyLibBar(compiledProject: CompiledProject, subprojectPrefix: String?) = with(compiledProject) {
@@ -305,6 +318,19 @@
assertEquals(expectedProjectStructureMetadata, parsedProjectStructureMetadata)
}
+ ZipFile(
+ project.projectDir.parentFile.resolve(
+ "repo/com/example/bar/my-lib-bar/1.0/my-lib-bar-1.0-sources.jar"
+ )
+ ).use { publishedSourcesJar ->
+ publishedSourcesJar.checkAllEntryNamesArePresent(
+ "commonMain/Bar.kt",
+ "jvmAndJsMain/BarJvmAndJs.kt",
+ "linuxAndJsMain/BarLinuxAndJs.kt",
+ "linuxX64Main/BarLinux.kt"
+ )
+ }
+
checkNamesOnCompileClasspath(
"$taskPrefix:compileKotlinMetadata",
shouldInclude = listOf(
diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/MppPublicationTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/MppPublicationTest.kt
new file mode 100644
index 0000000..60ba7cf
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/MppPublicationTest.kt
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+@file:Suppress("FunctionName")
+
+package org.jetbrains.kotlin.gradle
+
+import org.gradle.api.internal.project.ProjectInternal
+import org.gradle.api.publish.PublishingExtension
+import org.gradle.api.publish.maven.MavenPublication
+import org.gradle.testfixtures.ProjectBuilder
+import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
+import kotlin.test.Test
+import kotlin.test.assertTrue
+import kotlin.test.fail
+
+class MppPublicationTest {
+
+ private val project = ProjectBuilder.builder().build() as ProjectInternal
+
+ init {
+ project.plugins.apply("kotlin-multiplatform")
+ project.plugins.apply("maven-publish")
+ }
+
+ private val kotlin = project.extensions.getByType(KotlinMultiplatformExtension::class.java)
+
+ init {
+ kotlin.jvm()
+ kotlin.js().nodejs()
+ }
+
+ @Test
+ fun `contains kotlinMultiplatform publication`() {
+ project.evaluate()
+ val publishing = project.extensions.getByType(PublishingExtension::class.java)
+ publishing.publications
+ .withType(MavenPublication::class.java)
+ .findByName("kotlinMultiplatform") ?: fail("Missing 'kotlinMultiplatform' publication")
+ }
+
+
+ @Test
+ fun `all publication contains sourcesJar`() {
+ project.evaluate()
+ val publishing = project.extensions.getByType(PublishingExtension::class.java)
+ publishing.publications
+ .filterIsInstance<MavenPublication>()
+ .forEach { publication ->
+ val sources = publication.artifacts.filter { artifact -> artifact.classifier == "sources" }
+ assertTrue(sources.isNotEmpty(), "Expected at least one sources artifact for ${publication.name}")
+ }
+ }
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt
index 3be776a..167b83f 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt
@@ -203,6 +203,7 @@
private fun configurePublishingWithMavenPublish(project: Project) = project.pluginManager.withPlugin("maven-publish") { _ ->
val targets = project.multiplatformExtension.targets
+ val metadataTarget = project.multiplatformExtension.metadata()
val kotlinSoftwareComponent = project.multiplatformExtension.rootSoftwareComponent
project.extensions.configure(PublishingExtension::class.java) { publishing ->
@@ -213,12 +214,19 @@
(this as MavenPublicationInternal).publishWithOriginalFileName()
kotlinSoftwareComponent.publicationDelegate = this@apply
- project.multiplatformExtension.metadata {}.kotlinComponents.filterIsInstance<KotlinTargetComponentWithPublication>()
+ metadataTarget.kotlinComponents.filterIsInstance<KotlinTargetComponentWithPublication>()
.single().publicationDelegate = this@apply
+
+ project.whenEvaluated {
+ if (!metadataTarget.publishable) return@whenEvaluated
+ metadataTarget.kotlinComponents
+ .flatMap { component -> component.sourcesArtifacts }
+ .forEach { sourcesArtifact -> artifact(sourcesArtifact) }
+ }
}
// Enforce the order of creating the publications, since the metadata publication is used in the other publications:
- (targets.getByName(METADATA_TARGET_NAME) as AbstractKotlinTarget).createMavenPublications(publishing.publications)
+ metadataTarget.createMavenPublications(publishing.publications)
targets
.withType(AbstractKotlinTarget::class.java).matching { it.publishable && it.name != METADATA_TARGET_NAME }
.all {