-
-
Notifications
You must be signed in to change notification settings - Fork 149
Expand file tree
/
Copy pathRootPlugin.kt
More file actions
117 lines (99 loc) · 4.3 KB
/
RootPlugin.kt
File metadata and controls
117 lines (99 loc) · 4.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Copyright (c) 2024. Tony Robalik.
// SPDX-License-Identifier: Apache-2.0
package com.autonomousapps.subplugin
import com.autonomousapps.DependencyAnalysisExtension
import com.autonomousapps.Flags.FLAG_CLEAR_ARTIFACTS
import com.autonomousapps.Flags.FLAG_SILENT_WARNINGS
import com.autonomousapps.Flags.printBuildHealth
import com.autonomousapps.Flags.shouldAutoApply
import com.autonomousapps.getExtension
import com.autonomousapps.internal.RootOutputPaths
import com.autonomousapps.internal.advice.DslKind
import com.autonomousapps.internal.artifacts.DagpArtifacts
import com.autonomousapps.internal.artifacts.Resolver.Companion.interProjectResolver
import com.autonomousapps.internal.utils.log
import com.autonomousapps.services.InMemoryCache
import com.autonomousapps.tasks.BuildHealthTask
import com.autonomousapps.tasks.ComputeDuplicateDependenciesTask
import com.autonomousapps.tasks.GenerateBuildHealthTask
import com.autonomousapps.tasks.PrintDuplicateDependenciesTask
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.register
internal const val DEPENDENCY_ANALYSIS_PLUGIN = "com.autonomousapps.dependency-analysis"
/** This "plugin" is applied to the root project only. */
internal class RootPlugin(private val project: Project) {
init {
check(project == project.rootProject) {
"This plugin must only be applied to the root project. Was ${project.path}."
}
DependencyAnalysisExtension.create(project)
}
private val adviceResolver = interProjectResolver(
project = project,
artifact = DagpArtifacts.Kind.PROJECT_HEALTH
)
private val resolvedDepsResolver = interProjectResolver(
project = project,
artifact = DagpArtifacts.Kind.RESOLVED_DEPS
)
fun apply() = project.run {
logger.log("Adding root project tasks")
checkFlags()
configureRootProject()
conditionallyApplyToSubprojects()
}
/** Only apply to all subprojects if user hasn't requested otherwise. See [shouldAutoApply]. */
private fun Project.conditionallyApplyToSubprojects() {
if (!shouldAutoApply()) {
logger.debug("Not applying plugin to all subprojects. User must apply to each manually")
return
}
logger.debug("Applying plugin to all subprojects")
subprojects {
logger.debug("Auto-applying to $path.")
apply(plugin = DEPENDENCY_ANALYSIS_PLUGIN)
}
}
/** Check for presence of flags that no longer have an effect. */
private fun Project.checkFlags() {
val clearArtifacts = providers.gradleProperty(FLAG_CLEAR_ARTIFACTS)
if (clearArtifacts.isPresent) {
logger.warn(
"You have ${FLAG_CLEAR_ARTIFACTS}=${clearArtifacts.get()} set. This flag does nothing; you should remove it."
)
}
val silentWarnings = providers.gradleProperty(FLAG_SILENT_WARNINGS)
if (silentWarnings.isPresent) {
logger.warn(
"You have ${FLAG_SILENT_WARNINGS}=${silentWarnings.get()} set. This flag does nothing; you should remove it."
)
}
}
/** Root project. Configures lifecycle tasks that aggregates reports across all subprojects. */
private fun Project.configureRootProject() {
val paths = RootOutputPaths(this)
// Register this in the root project to centralize dependency synthesis files
InMemoryCache.register(this)
val computeDuplicatesTask = tasks.register<ComputeDuplicateDependenciesTask>("computeDuplicateDependencies") {
resolvedDependenciesReports.setFrom(resolvedDepsResolver.internal)
output.set(paths.duplicateDependenciesPath)
}
tasks.register<PrintDuplicateDependenciesTask>("printDuplicateDependencies") {
duplicateDependenciesReport.set(computeDuplicatesTask.flatMap { it.output })
}
val generateBuildHealthTask = tasks.register<GenerateBuildHealthTask>("generateBuildHealth") {
projectHealthReports.setFrom(adviceResolver.internal)
dslKind.set(DslKind.from(buildFile))
dependencyMap.set(getExtension().dependenciesHandler.map)
output.set(paths.buildHealthPath)
consoleOutput.set(paths.consoleReportPath)
outputFail.set(paths.shouldFailPath)
}
tasks.register<BuildHealthTask>("buildHealth") {
shouldFail.set(generateBuildHealthTask.flatMap { it.outputFail })
consoleReport.set(generateBuildHealthTask.flatMap { it.consoleOutput })
printBuildHealth.set(printBuildHealth())
}
}
}