[KPM] Implement 'transitiveRuntimeOnly' dependency configuration

This commit is contained in:
sebastian.sellmair
2022-01-25 13:38:22 +01:00
committed by Space
parent 6720742b84
commit 96ec6466c7
5 changed files with 73 additions and 5 deletions
@@ -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
)
}
}
@@ -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
)
}
}
}
@@ -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))
@@ -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
)
}
}
@@ -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())
}