[Gradle] Transform only composite metadata artifacts
^KT-49933
This commit is contained in:
committed by
Space Team
parent
4210e13103
commit
fbbd1d737a
+65
@@ -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) {
|
||||
|
||||
+15
-1
@@ -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 }
|
||||
-4
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user