From 96ec6466c7178a8ef13e59e52ecb1b48788a98d0 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Tue, 25 Jan 2022 13:38:22 +0100 Subject: [PATCH] [KPM] Implement 'transitiveRuntimeOnly' dependency configuration --- .../KotlinFragmentDependencyConfigurations.kt | 12 +++-- .../TransitiveRuntimeOnlyConfigurationTest.kt | 52 +++++++++++++++++++ .../DefaultKotlinFragmentConfigurations.kt | 2 + ...FragmentDependencyConfigurationsFactory.kt | 8 ++- .../plugin/mpp/pm20/KotlinGradleFragment.kt | 4 ++ 5 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/TransitiveRuntimeOnlyConfigurationTest.kt diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentDependencyConfigurations.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentDependencyConfigurations.kt index e2c14b8a90d..9df002893da 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentDependencyConfigurations.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentDependencyConfigurations.kt @@ -14,13 +14,17 @@ interface KotlinFragmentDependencyConfigurations : KotlinDependencyConfiguration /** This configuration includes the dependencies from the refines-parents */ val transitiveImplementationConfiguration: Configuration + /** This configuration includes the dependencies from the refines-parents */ + val transitiveRuntimeOnlyConfiguration: Configuration + private class Impl( override val apiConfiguration: Configuration, override val implementationConfiguration: Configuration, override val compileOnlyConfiguration: Configuration, override val runtimeOnlyConfiguration: Configuration, override val transitiveApiConfiguration: Configuration, - override val transitiveImplementationConfiguration: Configuration + override val transitiveImplementationConfiguration: Configuration, + override val transitiveRuntimeOnlyConfiguration: Configuration ) : KotlinFragmentDependencyConfigurations companion object { @@ -30,14 +34,16 @@ interface KotlinFragmentDependencyConfigurations : KotlinDependencyConfiguration compileOnlyConfiguration: Configuration, runtimeOnlyConfiguration: Configuration, transitiveApiConfiguration: Configuration, - transitiveImplementationConfiguration: Configuration + transitiveImplementationConfiguration: Configuration, + transitiveRuntimeOnlyConfiguration: Configuration ): KotlinFragmentDependencyConfigurations = Impl( apiConfiguration = apiConfiguration, implementationConfiguration = implementationConfiguration, compileOnlyConfiguration = compileOnlyConfiguration, runtimeOnlyConfiguration = runtimeOnlyConfiguration, transitiveApiConfiguration = transitiveApiConfiguration, - transitiveImplementationConfiguration = transitiveImplementationConfiguration + transitiveImplementationConfiguration = transitiveImplementationConfiguration, + transitiveRuntimeOnlyConfiguration = transitiveRuntimeOnlyConfiguration ) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/TransitiveRuntimeOnlyConfigurationTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/TransitiveRuntimeOnlyConfigurationTest.kt new file mode 100644 index 00000000000..3cb39af9ed1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/TransitiveRuntimeOnlyConfigurationTest.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("FunctionName") + +package org.jetbrains.kotlin.gradle.kpm + +import org.gradle.kotlin.dsl.creating +import org.gradle.kotlin.dsl.provideDelegate +import kotlin.test.Test +import kotlin.test.assertEquals + +class TransitiveRuntimeOnlyConfigurationTest : AbstractKpmExtensionTest() { + + @Test + fun `test transitiveRuntimeOnlyConfiguration contains dependencies from refines parents`() { + project.applyKpmPlugin() + kotlin.mainAndTest { + val left = fragments.create("left") { it.refines(common) } + val right = fragments.create("right") { it.refines(common) } + val bottomLeft = fragments.create("bottom") { it.refines(left) } + + common.dependencies { + implementation(project.files("common-implementation.jar")) + runtimeOnly(project.files("common-runtimeOnly.jar")) + } + + left.dependencies { + implementation(project.files("left-implementation.jar")) + runtimeOnly(project.files("left-runtimeOnly.jar")) + } + + right.dependencies { + implementation(project.files("right-implementation.jar")) + runtimeOnly(project.files("right-runtimeOnly.jar")) + } + + bottomLeft.dependencies { + implementation(project.files("bottomLeft-implementation.jar")) + runtimeOnly(project.files("bottomLeft-runtimeOnly.jar")) + } + + bottomLeft.transitiveRuntimeOnlyConfiguration.isCanBeResolved = true + assertEquals( + project.files("common-runtimeOnly.jar", "left-runtimeOnly.jar", "bottomLeft-runtimeOnly.jar").toSet(), + bottomLeft.transitiveRuntimeOnlyConfiguration.files + ) + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DefaultKotlinFragmentConfigurations.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DefaultKotlinFragmentConfigurations.kt index 23c4abc41e8..ef07cf5d7b1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DefaultKotlinFragmentConfigurations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DefaultKotlinFragmentConfigurations.kt @@ -34,6 +34,7 @@ val DefaultKotlinRuntimeDependenciesDefinition = ConfigurationDefinition( relations = FragmentConfigurationRelation { extendsFrom(dependencies.transitiveApiConfiguration) extendsFrom(dependencies.transitiveImplementationConfiguration) + extendsFrom(dependencies.transitiveRuntimeOnlyConfiguration) } ) @@ -64,6 +65,7 @@ val DefaultKotlinRuntimeElementsDefinition = ConfigurationDefinition( relations = FragmentConfigurationRelation { extendsFrom(dependencies.transitiveApiConfiguration) extendsFrom(dependencies.transitiveImplementationConfiguration) + extendsFrom(dependencies.transitiveRuntimeOnlyConfiguration) }, attributes = KotlinFragmentPlatformAttributes + KotlinFragmentProducerRuntimeUsageAttribute + FragmentAttributes { attribute(Category.CATEGORY_ATTRIBUTE, fragment.project.objects.named(Category::class.java, Category.LIBRARY)) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentDependencyConfigurationsFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentDependencyConfigurationsFactory.kt index a87a6b914d0..ddd0bd73e25 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentDependencyConfigurationsFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentDependencyConfigurationsFactory.kt @@ -21,6 +21,7 @@ object DefaultKotlinFragmentDependencyConfigurationsFactory : KotlinFragmentDepe val runtimeOnlyConfiguration = configurations.maybeCreate(names.disambiguateName("runtimeOnly")) val transitiveApiConfiguration = configurations.maybeCreate(names.disambiguateName("transitiveApi")) val transitiveImplementationConfiguration = configurations.maybeCreate(names.disambiguateName("transitiveImplementation")) + val transitiveRuntimeOnlyConfiguration = configurations.maybeCreate(names.disambiguateName("transitiveRuntimeOnly")) listOf( apiConfiguration, @@ -28,7 +29,8 @@ object DefaultKotlinFragmentDependencyConfigurationsFactory : KotlinFragmentDepe compileOnlyConfiguration, runtimeOnlyConfiguration, transitiveApiConfiguration, - transitiveImplementationConfiguration + transitiveImplementationConfiguration, + transitiveRuntimeOnlyConfiguration ).forEach { configuration -> configuration.isCanBeConsumed = false configuration.isCanBeResolved = false @@ -36,6 +38,7 @@ object DefaultKotlinFragmentDependencyConfigurationsFactory : KotlinFragmentDepe transitiveApiConfiguration.extendsFrom(apiConfiguration) transitiveImplementationConfiguration.extendsFrom(implementationConfiguration) + transitiveRuntimeOnlyConfiguration.extendsFrom(runtimeOnlyConfiguration) return KotlinFragmentDependencyConfigurations.create( apiConfiguration = apiConfiguration, @@ -43,7 +46,8 @@ object DefaultKotlinFragmentDependencyConfigurationsFactory : KotlinFragmentDepe compileOnlyConfiguration = compileOnlyConfiguration, runtimeOnlyConfiguration = runtimeOnlyConfiguration, transitiveApiConfiguration = transitiveApiConfiguration, - transitiveImplementationConfiguration = transitiveImplementationConfiguration + transitiveImplementationConfiguration = transitiveImplementationConfiguration, + transitiveRuntimeOnlyConfiguration = transitiveRuntimeOnlyConfiguration ) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt index 4f2e8938c19..ab166f53d34 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt @@ -58,6 +58,10 @@ open class KotlinGradleFragmentInternal @Inject constructor( this.transitiveImplementationConfiguration.name, other.get().transitiveImplementationConfiguration.name ) + project.addExtendsFromRelation( + this.transitiveRuntimeOnlyConfiguration.name, other.get().transitiveRuntimeOnlyConfiguration.name + ) + project.runProjectConfigurationHealthCheckWhenEvaluated { kotlinGradleFragmentConsistencyChecker.runAllChecks(this@KotlinGradleFragmentInternal, other.get()) }