[Gradle] Transform only composite metadata artifacts

^KT-49933
This commit is contained in:
Anton Lakotka
2023-01-17 17:25:31 +01:00
committed by Space Team
parent 4210e13103
commit fbbd1d737a
3 changed files with 80 additions and 5 deletions
@@ -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) {
@@ -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<Map<ComponentIdentifierKey, Set<String>>>
) {
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<Stri
.map { it.name }
.toSet()
internal val GranularMetadataTransformation?.metadataDependencyResolutionsOrEmpty get() = this?.metadataDependencyResolutions ?: emptyList()
internal val GranularMetadataTransformation?.metadataDependencyResolutionsOrEmpty get() = this?.metadataDependencyResolutions ?: emptyList()
internal val AttributeContainer.containsMultiplatformAttributes: Boolean get() =
keySet().any { it.name == KotlinPlatformType.attribute.name }
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.gradle.targets.metadata
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.artifacts.result.ResolvedArtifactResult
import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.attributes.Category
import org.gradle.api.attributes.Category.CATEGORY_ATTRIBUTE
import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE
@@ -368,9 +367,6 @@ class KotlinMetadataTargetConfigurator :
private val ResolvedArtifactResult.isMpp: Boolean get() = variant.attributes.containsMultiplatformAttributes
private val AttributeContainer.containsMultiplatformAttributes: Boolean get() =
keySet().any { it.name == KotlinPlatformType.attribute.name }
private val KotlinSourceSet.dependsOnClassesDirs: FileCollection get() = project.filesProvider {
internal.dependsOnClosure.mapNotNull { hierarchySourceSet ->
val compilation =