Skip to content

Commit 0fabed6

Browse files
committed
Apply the configuration filter for 'resolve-all-dependencies'
Previously, excluded configurations would be excluded from the graph, but they would still be resolved. By avoiding resolution altogether, we allow users to exclude any unresolvable dependency configurations. Fixes #126
1 parent a37a7f8 commit 0fabed6

File tree

4 files changed

+75
-9
lines changed

4 files changed

+75
-9
lines changed

plugin-test/src/test/groovy/org/gradle/github/dependencygraph/ConfigurationFilterDependencyExtractorTest.groovy

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,4 +284,43 @@ class ConfigurationFilterDependencyExtractorTest extends BaseExtractorTest {
284284
])
285285
}
286286

287+
def "does not attempt to resolve excluded configurations"() {
288+
given:
289+
settingsFile << "include 'a', 'b'"
290+
291+
buildFile << """
292+
project(':a') {
293+
apply plugin: 'java-library'
294+
dependencies {
295+
api 'org.test:foo:1.0'
296+
}
297+
configurations.all {
298+
incoming.beforeResolve {
299+
throw new RuntimeException("Should not resolve project :a")
300+
}
301+
}
302+
}
303+
project(':b') {
304+
apply plugin: 'java-library'
305+
dependencies {
306+
api 'org.test:bar:1.0'
307+
testImplementation 'org.test:baz:1.0'
308+
}
309+
configurations.testCompileClasspath {
310+
incoming.beforeResolve {
311+
throw new RuntimeException("Should not resolve configuration 'testCompileClasspath'")
312+
}
313+
}
314+
}
315+
"""
316+
317+
when:
318+
executer.withArgument("-DDEPENDENCY_GRAPH_EXCLUDE_PROJECTS=:a")
319+
executer.withArgument("-DDEPENDENCY_GRAPH_EXCLUDE_CONFIGURATIONS=test(Compile|Runtime)Classpath")
320+
run()
321+
322+
then:
323+
gitHubManifest().assertResolved(["org.test:bar:1.0"])
324+
}
325+
287326
}

plugin/src/main/kotlin/org/gradle/forceresolve/ForceDependencyResolutionPlugin.kt

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import org.gradle.api.Project
55
import org.gradle.api.Task
66
import org.gradle.api.invocation.Gradle
77
import org.gradle.api.tasks.TaskProvider
8+
import org.gradle.dependencygraph.extractor.ResolvedConfigurationFilter
9+
import org.gradle.dependencygraph.util.PluginParameters
810
import org.gradle.util.GradleVersion
911

1012
private const val RESOLVE_PROJECT_TASK = "ForceDependencyResolutionPlugin_resolveProjectDependencies"
@@ -14,14 +16,22 @@ private const val RESOLVE_ALL_TASK = "ForceDependencyResolutionPlugin_resolveAll
1416
* Adds a task to resolve all dependencies in a Gradle build tree.
1517
*/
1618
class ForceDependencyResolutionPlugin : Plugin<Gradle> {
19+
20+
// Properties are lazily initialized so that System Properties are initialized by the time
21+
// the values are used. This is required due to a bug in older Gradle versions. (https://github.com/gradle/gradle/issues/6825)
22+
private val pluginParameters = PluginParameters()
23+
private val configurationFilter by lazy {
24+
ResolvedConfigurationFilter(pluginParameters)
25+
}
26+
1727
override fun apply(gradle: Gradle) {
1828
gradle.projectsEvaluated {
1929
val resolveAllDeps = gradle.rootProject.tasks.register(RESOLVE_ALL_TASK)
2030

2131
// Depend on "dependencies" task in all projects
2232
gradle.allprojects { project ->
2333
val projectTaskFactory = getResolveProjectDependenciesTaskFactory()
24-
val resolveProjectDeps = projectTaskFactory.create(project)
34+
val resolveProjectDeps = projectTaskFactory.create(project, configurationFilter)
2535
resolveAllDeps.configure {
2636
it.dependsOn(resolveProjectDeps)
2737
}
@@ -47,19 +57,22 @@ class ForceDependencyResolutionPlugin : Plugin<Gradle> {
4757
}
4858

4959
private interface ResolveProjectDependenciesTaskFactory {
50-
fun create(project: Project): TaskProvider<out Task>
60+
fun create(project: Project, filter: ResolvedConfigurationFilter): TaskProvider<out Task>
5161

5262
object Current : ResolveProjectDependenciesTaskFactory {
53-
override fun create(project: Project): TaskProvider<out Task> {
54-
return project.tasks.register(RESOLVE_PROJECT_TASK, ResolveProjectDependenciesTask::class.java)
63+
override fun create(project: Project, filter: ResolvedConfigurationFilter): TaskProvider<out Task> {
64+
return project.tasks.register(RESOLVE_PROJECT_TASK, ResolveProjectDependenciesTask::class.java) {
65+
it.configurationFilter = filter
66+
}
5567
}
5668
}
5769

5870
object Legacy : ResolveProjectDependenciesTaskFactory {
59-
override fun create(project: Project): TaskProvider<out Task> {
60-
return project.tasks.register(RESOLVE_PROJECT_TASK, LegacyResolveProjectDependenciesTask::class.java)
71+
override fun create(project: Project, filter: ResolvedConfigurationFilter): TaskProvider<out Task> {
72+
return project.tasks.register(RESOLVE_PROJECT_TASK, LegacyResolveProjectDependenciesTask::class.java) {
73+
it.configurationFilter = filter
74+
}
6175
}
6276
}
6377
}
64-
6578
}

plugin/src/main/kotlin/org/gradle/forceresolve/LegacyResolveProjectDependenciesTask.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,20 @@ package org.gradle.forceresolve
22

33
import org.gradle.api.DefaultTask
44
import org.gradle.api.artifacts.Configuration
5+
import org.gradle.api.tasks.Internal
56
import org.gradle.api.tasks.TaskAction
7+
import org.gradle.dependencygraph.extractor.ResolvedConfigurationFilter
68
import org.gradle.work.DisableCachingByDefault
79

810
@DisableCachingByDefault(because = "Not worth caching")
911
abstract class LegacyResolveProjectDependenciesTask: DefaultTask() {
12+
@Internal
13+
var configurationFilter: ResolvedConfigurationFilter? = null
14+
1015
private fun getReportableConfigurations(): List<Configuration> {
11-
return project.configurations.filter { it.isCanBeResolved }
16+
return project.configurations.filter {
17+
it.isCanBeResolved && configurationFilter!!.include(project.path, it.name)
18+
}
1219
}
1320

1421
@TaskAction

plugin/src/main/kotlin/org/gradle/forceresolve/ResolveProjectDependenciesTask.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,29 @@ import org.gradle.api.DefaultTask
44
import org.gradle.api.artifacts.Configuration
55
import org.gradle.api.artifacts.result.ResolvedComponentResult
66
import org.gradle.api.provider.Provider
7+
import org.gradle.api.tasks.Internal
78
import org.gradle.api.tasks.TaskAction
9+
import org.gradle.dependencygraph.extractor.ResolvedConfigurationFilter
810
import org.gradle.internal.serialization.Cached
911
import org.gradle.work.DisableCachingByDefault
1012

1113
@DisableCachingByDefault(because = "Not worth caching")
1214
abstract class ResolveProjectDependenciesTask: DefaultTask() {
1315
private val configurationResolvers = Cached.of { createConfigurationResolvers() }
1416

17+
@Internal
18+
var configurationFilter: ResolvedConfigurationFilter? = null
19+
1520
private fun createConfigurationResolvers(): List<Provider<ResolvedComponentResult>> {
1621
return getReportableConfigurations().map {
1722
it.incoming.resolutionResult.rootComponent
1823
}
1924
}
2025

2126
private fun getReportableConfigurations(): List<Configuration> {
22-
return project.configurations.filter { it.isCanBeResolved }
27+
return project.configurations.filter {
28+
it.isCanBeResolved && configurationFilter!!.include(project.path, it.name)
29+
}
2330
}
2431

2532
@TaskAction

0 commit comments

Comments
 (0)