From fbbd1d737aba4effe86665222cc908caa8e118e3 Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Tue, 17 Jan 2023 17:25:31 +0100 Subject: [PATCH] [Gradle] Transform only composite metadata artifacts ^KT-49933 --- .../kotlin/gradle/HierarchicalMppIT.kt | 65 +++++++++++++++++++ .../mpp/GranularMetadataTransformation.kt | 16 ++++- .../KotlinMetadataTargetConfigurator.kt | 4 -- 3 files changed, 80 insertions(+), 5 deletions(-) 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 66bc913e6ac..061577ee636 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 @@ -221,6 +221,71 @@ class HierarchicalMppIT : KGPBaseTest() { } } + @GradleTest + @DisplayName("Check that only composite metadata artifacts are transformed") + fun testOnlyCompositeMetadataArtifactsTransformed(gradleVersion: GradleVersion, @TempDir tempDir: Path) { + val buildOptions = defaultBuildOptions.copy(logLevel = LogLevel.DEBUG) + publishThirdPartyLib(withGranularMetadata = true, gradleVersion = gradleVersion, localRepoDir = tempDir) + + val regex = """artifact: '(.+)'""".toRegex() + fun BuildResult.transformedArtifacts() = output + .lineSequence() + .filter { it.contains("Transform composite metadata") } + .mapNotNull { regex.find(it)?.groups?.get(1)?.value } + .map { File(it).name } + .toSet() + + nativeProject( + "my-lib-foo".withPrefix, + gradleVersion, + localRepoDir = tempDir, + buildOptions = buildOptions + ).run { + build("publish") { + assertEquals( + setOf("third-party-lib-metadata-1.0.jar"), + transformedArtifacts() + ) + } + } + + nativeProject( + "my-lib-bar".withPrefix, + gradleVersion, + localRepoDir = tempDir, + buildOptions = buildOptions + ).run { + build("publish") { + assertEquals( + setOf( + "my-lib-foo-metadata-1.0-all.jar", + "third-party-lib-metadata-1.0.jar" + ), + transformedArtifacts() + ) + } + } + + nativeProject( + "my-app".withPrefix, + gradleVersion, + localRepoDir = tempDir, + buildOptions = buildOptions + ).run { + testDependencyTransformations { + assertEquals( + setOf( + "my-lib-foo-metadata-1.0-all.jar", + "my-lib-bar-metadata-1.0-all.jar", + "third-party-lib-metadata-1.0.jar", + "kotlin-test-js-${buildOptions.kotlinVersion}.jar" + ), + transformedArtifacts() + ) + } + } + } + @GradleTest @DisplayName("Works with published JS library") fun testHmppWithPublishedJsBothDependency(gradleVersion: GradleVersion, @TempDir tempDir: Path) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt index ec9b2e6c05b..3fe6b87e806 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt @@ -9,11 +9,14 @@ import org.gradle.api.Project import org.gradle.api.artifacts.component.* import org.gradle.api.artifacts.result.ResolvedComponentResult import org.gradle.api.artifacts.result.ResolvedDependencyResult +import org.gradle.api.attributes.AttributeContainer import org.gradle.api.file.FileCollection +import org.gradle.api.logging.Logging import org.gradle.api.provider.Provider import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ArtifactMetadataProvider import org.jetbrains.kotlin.gradle.plugin.sources.internal @@ -105,6 +108,8 @@ internal class GranularMetadataTransformation( val params: Params, visibleSourceSetsFromParentsProvider: () -> Iterable>> ) { + private val logger = Logging.getLogger("GranularMetadataTransformation[${params.sourceSetName}]") + class Params( val sourceSetName: String, val resolvedMetadataConfiguration: LazyResolvedConfiguration, @@ -167,10 +172,12 @@ internal class GranularMetadataTransformation( continue } + logger.debug("Transform dependency: $resolvedDependency") val dependencyResult = processDependency( resolvedDependency, visibleSourceSetsFromParents[componentId.uniqueKey].orEmpty() ) + logger.debug("Transformation result of dependency $resolvedDependency: $dependencyResult") result.add(dependencyResult) @@ -226,10 +233,14 @@ internal class GranularMetadataTransformation( .resolvedMetadataConfiguration .dependencyArtifacts(dependency) .singleOrNull() + // Make sure that resolved metadata artifact is actually Multiplatform one + ?.takeIf { it.variant.attributes.containsMultiplatformAttributes } // expected only ony Composite Metadata Klib, but if dependency got resolved into platform variant // when source set is a leaf then we might get multiple artifacts in such case we must return KeepOriginal ?: return MetadataDependencyResolution.KeepOriginalDependency(module) + logger.debug("Transform composite metadata artifact: '${compositeMetadataArtifact.file}'") + val mppDependencyMetadataExtractor = params.projectStructureMetadataExtractorFactory.create(compositeMetadataArtifact) val isResolvedToProject = moduleId is ProjectComponentIdentifier && moduleId.build.isCurrentBuild @@ -355,4 +366,7 @@ private val KotlinMultiplatformExtension.platformCompilationSourceSets: Set val compilation =