[Gradle] Avoid configuration resolution in MPP projects

Add `getResolvedArtifactsCompat` for compatibility with gradle <7.4
However configurations are still resolved in these gradle versions

^KT-51940 Verification Pending
This commit is contained in:
Anton Lakotka
2023-02-23 12:24:54 +01:00
committed by Space Team
parent b3890885c4
commit fa4bbdf6d6
6 changed files with 71 additions and 2 deletions
@@ -1113,6 +1113,27 @@ class HierarchicalMppIT : KGPBaseTest() {
}
}
@GradleTest
@GradleTestVersions(maxVersion = TestVersions.Gradle.G_7_1)
@DisplayName("KT-51940: Test ArtifactCollection.getResolvedArtifactsCompat with Gradle earlier than 7.4")
fun `test getResolvedArtifactsCompat with Gradle earlier than 7_4`(gradleVersion: GradleVersion) {
project("kt-51940-hmpp-resolves-configurations-during-configuration", gradleVersion = gradleVersion) {
build("assemble", "--dry-run") {
assertOutputContains("Configuration Resolved")
}
}
}
@GradleTest
@GradleTestVersions(minVersion = TestVersions.Gradle.G_7_4)
@DisplayName("KT-51940: Configurations should not resolved during configuration phase")
fun `test configurations should not resolved during configuration phase`(gradleVersion: GradleVersion) {
project("kt-51940-hmpp-resolves-configurations-during-configuration", gradleVersion = gradleVersion) {
build("assemble", "--dry-run") {
assertOutputDoesNotContain("Configuration Resolved")
}
}
}
private fun TestProject.testDependencyTransformations(
subproject: String? = null,
@@ -0,0 +1,30 @@
import java.util.concurrent.atomic.AtomicBoolean
plugins {
kotlin("multiplatform")
}
repositories {
mavenLocal()
mavenCentral()
}
kotlin {
targetHierarchy.default()
jvm()
linuxX64()
linuxArm64()
}
// Setup configuration resolution hook
// Report configurations that is going to be resolved before the task graph is ready
val isResolutionAllowed = AtomicBoolean(false)
project.gradle.taskGraph.whenReady { isResolutionAllowed.set(true) }
configurations.all {
incoming.beforeResolve {
if (isResolutionAllowed.get()) return@beforeResolve
println("!!!Configuration Resolved: $name")
}
}
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.targets.native.internal.*
import org.jetbrains.kotlin.gradle.tasks.*
import org.jetbrains.kotlin.gradle.utils.filesProvider
import org.jetbrains.kotlin.gradle.utils.getResolvedArtifactsCompat
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
@@ -327,13 +328,13 @@ class KotlinMetadataTargetConfigurator :
val transformationTask = project.locateOrRegisterMetadataDependencyTransformationTask(sourceSet)
val artifacts = sourceSet.internal.resolvableMetadataConfiguration.incoming.artifacts
val artifacts = sourceSet.internal.resolvableMetadataConfiguration.incoming.artifacts.getResolvedArtifactsCompat(project)
// Metadata from visible source sets within dependsOn closure
compilation.compileDependencyFiles += sourceSet.dependsOnClassesDirs
// Requested dependencies that are not Multiplatform Libraries. for example stdlib-common
compilation.compileDependencyFiles += project.filesProvider { artifacts.filterNot { it.isMpp }.map { it.file } }
compilation.compileDependencyFiles += project.files(artifacts.map { it.filterNot { it.isMpp }.map { it.file } })
// Transformed Multiplatform Libraries based on source set visibility
compilation.compileDependencyFiles += project.files(transformationTask.map { it.allTransformedLibraries })
@@ -19,12 +19,15 @@ package org.jetbrains.kotlin.gradle.utils
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.artifacts.ArtifactCollection
import org.gradle.api.artifacts.result.ResolvedArtifactResult
import org.gradle.api.file.ArchiveOperations
import org.gradle.api.file.CopySpec
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.file.FileTree
import org.gradle.api.internal.project.ProjectInternal
import org.gradle.api.internal.tasks.testing.TestDescriptorInternal
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.WorkResult
import org.gradle.api.tasks.bundling.AbstractArchiveTask
import org.gradle.api.tasks.testing.TestDescriptor
@@ -113,3 +116,13 @@ internal fun Task.doNotTrackStateCompat(because: String) {
doNotTrackState(because)
}
}
/**
* [ArtifactCollection.getResolvedArtifacts] is available after 7.4 (inclusive)
*/
internal fun ArtifactCollection.getResolvedArtifactsCompat(project: Project): Provider<Set<ResolvedArtifactResult>> =
if (GradleVersion.current() >= GradleVersion.version("7.4")) {
resolvedArtifacts
} else {
project.provider { artifacts }
}