[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
|
@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) {
|
||||||
|
|||||||
+14
@@ -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
|
||||||
@@ -356,3 +367,6 @@ private val KotlinMultiplatformExtension.platformCompilationSourceSets: Set<Stri
|
|||||||
.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 }
|
||||||
-4
@@ -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 =
|
||||||
|
|||||||
Reference in New Issue
Block a user