From fa4bbdf6d6f2d954490e1c2518f8ea401d869ac4 Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Thu, 23 Feb 2023 12:24:54 +0100 Subject: [PATCH] [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 --- .../kotlin/gradle/HierarchicalMppIT.kt | 21 +++++++++++++ .../build.gradle.kts | 30 +++++++++++++++++++ .../settings.gradle.kts | 1 + .../src/commonMain/kotlin/common.kt | 3 ++ .../KotlinMetadataTargetConfigurator.kt | 5 ++-- .../kotlin/gradle/utils/compatibility.kt | 13 ++++++++ 6 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-51940-hmpp-resolves-configurations-during-configuration/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-51940-hmpp-resolves-configurations-during-configuration/settings.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-51940-hmpp-resolves-configurations-during-configuration/src/commonMain/kotlin/common.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt index 95da971da4e..4e0906a1d2d 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt @@ -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, diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-51940-hmpp-resolves-configurations-during-configuration/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-51940-hmpp-resolves-configurations-during-configuration/build.gradle.kts new file mode 100644 index 00000000000..b189482578e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-51940-hmpp-resolves-configurations-during-configuration/build.gradle.kts @@ -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") + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-51940-hmpp-resolves-configurations-during-configuration/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-51940-hmpp-resolves-configurations-during-configuration/settings.gradle.kts new file mode 100644 index 00000000000..1f334d60128 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-51940-hmpp-resolves-configurations-during-configuration/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "test-project" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-51940-hmpp-resolves-configurations-during-configuration/src/commonMain/kotlin/common.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-51940-hmpp-resolves-configurations-during-configuration/src/commonMain/kotlin/common.kt new file mode 100644 index 00000000000..fa72a8b6cd6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-51940-hmpp-resolves-configurations-during-configuration/src/commonMain/kotlin/common.kt @@ -0,0 +1,3 @@ +package lib + +fun commonMain() = "common" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index 27cc8e3373f..5c7c74924b6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -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 }) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/compatibility.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/compatibility.kt index 49734dd702d..a05e0b16f59 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/compatibility.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/compatibility.kt @@ -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> = + if (GradleVersion.current() >= GradleVersion.version("7.4")) { + resolvedArtifacts + } else { + project.provider { artifacts } + } \ No newline at end of file