[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 @GradleTest
@DisplayName("Works with published JS library") @DisplayName("Works with published JS library")
fun testHmppWithPublishedJsBothDependency(gradleVersion: GradleVersion, @TempDir tempDir: Path) { 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.component.*
import org.gradle.api.artifacts.result.ResolvedComponentResult import org.gradle.api.artifacts.result.ResolvedComponentResult
import org.gradle.api.artifacts.result.ResolvedDependencyResult import org.gradle.api.artifacts.result.ResolvedDependencyResult
import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.file.FileCollection import org.gradle.api.file.FileCollection
import org.gradle.api.logging.Logging
import org.gradle.api.provider.Provider import org.gradle.api.provider.Provider
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull 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.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ArtifactMetadataProvider import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ArtifactMetadataProvider
import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.plugin.sources.internal
@@ -105,6 +108,8 @@ internal class GranularMetadataTransformation(
val params: Params, val params: Params,
visibleSourceSetsFromParentsProvider: () -> Iterable<Map<ComponentIdentifierKey, Set<String>>> visibleSourceSetsFromParentsProvider: () -> Iterable<Map<ComponentIdentifierKey, Set<String>>>
) { ) {
private val logger = Logging.getLogger("GranularMetadataTransformation[${params.sourceSetName}]")
class Params( class Params(
val sourceSetName: String, val sourceSetName: String,
val resolvedMetadataConfiguration: LazyResolvedConfiguration, val resolvedMetadataConfiguration: LazyResolvedConfiguration,
@@ -167,10 +172,12 @@ internal class GranularMetadataTransformation(
continue continue
} }
logger.debug("Transform dependency: $resolvedDependency")
val dependencyResult = processDependency( val dependencyResult = processDependency(
resolvedDependency, resolvedDependency,
visibleSourceSetsFromParents[componentId.uniqueKey].orEmpty() visibleSourceSetsFromParents[componentId.uniqueKey].orEmpty()
) )
logger.debug("Transformation result of dependency $resolvedDependency: $dependencyResult")
result.add(dependencyResult) result.add(dependencyResult)
@@ -226,10 +233,14 @@ internal class GranularMetadataTransformation(
.resolvedMetadataConfiguration .resolvedMetadataConfiguration
.dependencyArtifacts(dependency) .dependencyArtifacts(dependency)
.singleOrNull() .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 // 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 // when source set is a leaf then we might get multiple artifacts in such case we must return KeepOriginal
?: return MetadataDependencyResolution.KeepOriginalDependency(module) ?: return MetadataDependencyResolution.KeepOriginalDependency(module)
logger.debug("Transform composite metadata artifact: '${compositeMetadataArtifact.file}'")
val mppDependencyMetadataExtractor = params.projectStructureMetadataExtractorFactory.create(compositeMetadataArtifact) val mppDependencyMetadataExtractor = params.projectStructureMetadataExtractorFactory.create(compositeMetadataArtifact)
val isResolvedToProject = moduleId is ProjectComponentIdentifier && moduleId.build.isCurrentBuild val isResolvedToProject = moduleId is ProjectComponentIdentifier && moduleId.build.isCurrentBuild
@@ -355,4 +366,7 @@ private val KotlinMultiplatformExtension.platformCompilationSourceSets: Set<Stri
.map { it.name } .map { it.name }
.toSet() .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.Project
import org.gradle.api.Task import org.gradle.api.Task
import org.gradle.api.artifacts.result.ResolvedArtifactResult 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
import org.gradle.api.attributes.Category.CATEGORY_ATTRIBUTE import org.gradle.api.attributes.Category.CATEGORY_ATTRIBUTE
import org.gradle.api.attributes.Usage.USAGE_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 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 { private val KotlinSourceSet.dependsOnClassesDirs: FileCollection get() = project.filesProvider {
internal.dependsOnClosure.mapNotNull { hierarchySourceSet -> internal.dependsOnClosure.mapNotNull { hierarchySourceSet ->
val compilation = val compilation =