From 11b7fe2c4a51fb48bd0e0a383a5a25fffc114401 Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Wed, 5 Apr 2023 15:44:11 +0200 Subject: [PATCH] [Gradle] Add possibility to disable default multiplatform publications Additionally, skip pom rewriting mechanism in case if default publications were disabled to prevent unexpected poms. --- .../kotlin/gradle/HierarchicalMppIT.kt | 30 +++++++++++++ .../app/build.gradle.kts | 24 ++++++++++ .../app/src/commonMain/kotlin/common.kt | 6 +++ .../build.gradle.kts | 10 +++++ .../libWithCustomLayout/build.gradle.kts | 45 +++++++++++++++++++ .../libWithCustomLayout/gradle.properties | 1 + .../commonMain/kotlin/libWithCustomLayout.kt | 6 +++ .../libWithDefaultLayout/build.gradle.kts | 33 ++++++++++++++ .../commonMain/kotlin/libWithDefaultLayout.kt | 6 +++ .../settings.gradle.kts | 5 +++ .../gradle/plugin/PropertiesProvider.kt | 5 +++ .../kotlin/gradle/plugin/mpp/Publishing.kt | 9 ++-- .../plugin/mpp/mppDependencyRewritingUtils.kt | 5 +++ 13 files changed, 182 insertions(+), 3 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/app/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/app/src/commonMain/kotlin/common.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/gradle.properties create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/src/commonMain/kotlin/libWithCustomLayout.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithDefaultLayout/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithDefaultLayout/src/commonMain/kotlin/libWithDefaultLayout.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/settings.gradle.kts 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 190b84277cc..0d418413b2a 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 @@ -1152,6 +1152,36 @@ open class HierarchicalMppIT : KGPBaseTest() { } } + @GradleTest + @DisplayName("It should be possible to disable default publications for stdlib and other kotlin libraries") + fun `test disable default publications`(gradleVersion: GradleVersion, @TempDir tempDir: Path) { + project("mppCustomPublicationLayout", gradleVersion = gradleVersion, localRepoDir = tempDir) { + build(":libWithCustomLayout:publishKotlinPublicationToMavenRepository") { + listOf("jvm.jar", "linuxArm64.klib", "linuxX64.klib") + .map { tempDir.resolve("test/libWithCustomLayout/1.0/libWithCustomLayout-1.0-$it") } + .forEach { if (!it.exists()) fail("Artifact $it does not exist") } + } + + build(":libWithDefaultLayout:publish") { + val pom = tempDir.resolve("test/libWithDefaultLayout-jvm/1.0/libWithDefaultLayout-jvm-1.0.pom").readText() + val expectedDependency = """ + | + | test + | libWithCustomLayout + | 1.0 + | compile + | + """.trimMargin() + + if (expectedDependency !in pom) { + fail("Expected to find:\n$expectedDependency\nin pom file:\n$pom") + } + } + + build(":app:assemble") + } + } + private fun TestProject.testDependencyTransformations( subproject: String? = null, diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/app/build.gradle.kts new file mode 100644 index 00000000000..c47a9f442b2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/app/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + kotlin("multiplatform") +} + +repositories { + maven("") +} + + +kotlin { + targetHierarchy.default() + + jvm() + linuxX64() + linuxArm64() + + sourceSets { + commonMain { + dependencies { + api("test:libWithDefaultLayout:1.0") + } + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/app/src/commonMain/kotlin/common.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/app/src/commonMain/kotlin/common.kt new file mode 100644 index 00000000000..5ce0f75b1bb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/app/src/commonMain/kotlin/common.kt @@ -0,0 +1,6 @@ +package app + +fun app() { + lib.libWithDefaultLayout() + lib.libWithCustomLayout() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/build.gradle.kts new file mode 100644 index 00000000000..edb5d3e9a30 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + kotlin("multiplatform") apply false +} + +allprojects { + repositories { + mavenLocal() + mavenCentral() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/build.gradle.kts new file mode 100644 index 00000000000..e68b4e44fd1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/build.gradle.kts @@ -0,0 +1,45 @@ +plugins { + kotlin("multiplatform") + `maven-publish` +} + +group = "test" +version = "1.0" + +kotlin { + targetHierarchy.default() + + jvm() + linuxX64() + linuxArm64() +} + +// Gradle magical spell to access SoftwareComponentFactory +abstract class SoftwareComponentFactoryProvider @Inject constructor( + val softwareComponentFactory: SoftwareComponentFactory +) +val softwareComponentFactoryProvider = project.objects.newInstance() +val customComponent = softwareComponentFactoryProvider.softwareComponentFactory.adhoc("customKotlin") + +afterEvaluate { + kotlin.targets.all { + val configuration = configurations.getByName(apiElementsConfigurationName) + configuration.artifacts.forEach { + it as ConfigurablePublishArtifact + it.classifier = targetName + } + customComponent.addVariantsFromConfiguration(configuration) {} + } +} + +publishing { + repositories { + maven("") + } + + publications { + create("kotlin") { + from(customComponent) + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/gradle.properties new file mode 100644 index 00000000000..fae7a15540a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/gradle.properties @@ -0,0 +1 @@ +kotlin.internal.mpp.createDefaultMultiplatformPublications=false \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/src/commonMain/kotlin/libWithCustomLayout.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/src/commonMain/kotlin/libWithCustomLayout.kt new file mode 100644 index 00000000000..38aafe2cf1f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithCustomLayout/src/commonMain/kotlin/libWithCustomLayout.kt @@ -0,0 +1,6 @@ +package lib + +fun libWithCustomLayout() { + +} + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithDefaultLayout/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithDefaultLayout/build.gradle.kts new file mode 100644 index 00000000000..da7769933fd --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithDefaultLayout/build.gradle.kts @@ -0,0 +1,33 @@ +plugins { + kotlin("multiplatform") + `maven-publish` +} + +group = "test" +version = "1.0" + +repositories { + maven("") +} + +kotlin { + targetHierarchy.default() + + jvm() + linuxX64() + linuxArm64() + + sourceSets { + commonMain { + dependencies { + api(project(":libWithCustomLayout")) + } + } + } +} + +publishing { + repositories { + maven("") + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithDefaultLayout/src/commonMain/kotlin/libWithDefaultLayout.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithDefaultLayout/src/commonMain/kotlin/libWithDefaultLayout.kt new file mode 100644 index 00000000000..ac03529b7df --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/libWithDefaultLayout/src/commonMain/kotlin/libWithDefaultLayout.kt @@ -0,0 +1,6 @@ +package lib + +fun libWithDefaultLayout() { + libWithCustomLayout() +} + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/settings.gradle.kts new file mode 100644 index 00000000000..c48317bf4a6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/mppCustomPublicationLayout/settings.gradle.kts @@ -0,0 +1,5 @@ +include( + ":libWithDefaultLayout", + ":libWithCustomLayout", + ":app" +) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt index 06ea89d5143..65a12b2e6de 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLI import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_ABI_SNAPSHOT import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_COMPILER_KEEP_INCREMENTAL_COMPILATION_CACHES_IN_MEMORY import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_COMPILER_USE_PRECISE_COMPILATION_RESULTS_BACKUP +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_CREATE_DEFAULT_MULTIPLATFORM_PUBLICATIONS import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_JS_KARMA_BROWSERS import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ANDROID_GRADLE_PLUGIN_COMPATIBILITY_NO_WARN import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ANDROID_SOURCE_SET_LAYOUT_ANDROID_STYLE_NO_WARN @@ -509,6 +510,9 @@ internal class PropertiesProvider private constructor(private val project: Proje val suppressExperimentalICOptimizationsWarning: Boolean get() = booleanProperty(KOTLIN_SUPPRESS_EXPERIMENTAL_IC_OPTIMIZATIONS_WARNING) ?: false + val createDefaultMultiplatformPublications: Boolean + get() = booleanProperty(KOTLIN_CREATE_DEFAULT_MULTIPLATFORM_PUBLICATIONS) ?: true + /** * Retrieves a comma-separated list of browsers to use when running karma tests for [target] * @see KOTLIN_JS_KARMA_BROWSERS @@ -594,6 +598,7 @@ internal class PropertiesProvider private constructor(private val project: Proje const val KOTLIN_COMPILER_USE_PRECISE_COMPILATION_RESULTS_BACKUP = "kotlin.compiler.preciseCompilationResultsBackup" const val KOTLIN_COMPILER_KEEP_INCREMENTAL_COMPILATION_CACHES_IN_MEMORY = "kotlin.compiler.keepIncrementalCompilationCachesInMemory" const val KOTLIN_SUPPRESS_EXPERIMENTAL_IC_OPTIMIZATIONS_WARNING = "kotlin.compiler.suppressExperimentalICOptimizationsWarning" + const val KOTLIN_CREATE_DEFAULT_MULTIPLATFORM_PUBLICATIONS = "kotlin.internal.mpp.createDefaultMultiplatformPublications" } companion object { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/Publishing.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/Publishing.kt index 3613a2cb66f..21612f8ecb1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/Publishing.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/Publishing.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope import org.jetbrains.kotlin.gradle.plugin.whenEvaluated @@ -28,9 +29,11 @@ import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnab import org.jetbrains.kotlin.gradle.tooling.buildKotlinToolingMetadataTask internal fun configurePublishingWithMavenPublish(project: Project) = project.pluginManager.withPlugin("maven-publish") { - project.extensions.configure(PublishingExtension::class.java) { publishing -> - createRootPublication(project, publishing) - createTargetPublications(project, publishing) + if (project.kotlinPropertiesProvider.createDefaultMultiplatformPublications) { + project.extensions.configure(PublishingExtension::class.java) { publishing -> + createRootPublication(project, publishing) + createTargetPublications(project, publishing) + } } project.components.add(project.multiplatformExtension.rootSoftwareComponent) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/mppDependencyRewritingUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/mppDependencyRewritingUtils.kt index 8b8c059154d..9dedd13f6eb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/mppDependencyRewritingUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/mppDependencyRewritingUtils.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationToRunnableFiles import org.jetbrains.kotlin.gradle.plugin.KotlinTargetComponent +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsageContext.MavenScope import org.jetbrains.kotlin.gradle.utils.getValue @@ -152,6 +153,10 @@ private fun associateDependenciesWithActualModuleDependencies( val dependencyProjectKotlinExtension = dependencyProject.multiplatformExtensionOrNull ?: return@associate noMapping + // Non-default publication layouts are not supported for pom rewriting + if (!dependencyProject.kotlinPropertiesProvider.createDefaultMultiplatformPublications) + return@associate noMapping + val resolved = resolvedDependencies[Triple(dependency.group!!, dependency.name, dependency.version!!)] ?: return@associate noMapping