build(modules): add :modules:reportModuleOrder task (#4568)
parent
1196034fd4
commit
a9b9db5942
|
@ -34,6 +34,9 @@ dependencies {
|
|||
implementation("org.javassist:javassist:3.27.0-GA")
|
||||
implementation("dom4j:dom4j:1.6.1")
|
||||
|
||||
// graph analysis
|
||||
implementation("org.jgrapht:jgrapht-core:1.5.0")
|
||||
|
||||
// for inspecting modules
|
||||
implementation("org.terasology.gestalt:gestalt-module:7.1.0")
|
||||
|
||||
|
|
|
@ -8,11 +8,15 @@ import org.gradle.api.artifacts.ModuleIdentifier
|
|||
import org.gradle.api.artifacts.component.ModuleComponentIdentifier
|
||||
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
|
||||
import org.gradle.api.artifacts.result.ResolvedArtifactResult
|
||||
import org.gradle.api.artifacts.result.ResolvedComponentResult
|
||||
import org.gradle.api.artifacts.result.ResolvedDependencyResult
|
||||
import org.gradle.api.artifacts.result.UnresolvedDependencyResult
|
||||
import org.gradle.api.logging.Logger
|
||||
import org.gradle.api.logging.Logging
|
||||
import org.gradle.api.provider.Provider
|
||||
import org.jgrapht.Graph
|
||||
import org.jgrapht.graph.DefaultDirectedGraph
|
||||
import org.jgrapht.traverse.TopologicalOrderIterator
|
||||
|
||||
val ModuleIdentifier.isTerasologyModule: Boolean
|
||||
get() = group == TERASOLOGY_MODULES_GROUP
|
||||
|
@ -82,3 +86,62 @@ fun moduleDependencyArtifacts(modulesConfig: Configuration): Iterable<ResolvedAr
|
|||
}
|
||||
|
||||
|
||||
fun moduleDependencyOrdering(modulesConfig: Configuration): List<String> {
|
||||
// configurations.resolvedConfiguration is more straightforward if you just want all the artifacts,
|
||||
// but using `.incoming` lets us turn on lenient mode as well as do more accurate filtering of local modules
|
||||
val resolvable = modulesConfig.incoming
|
||||
val artifactView = resolvable.artifactView {
|
||||
lenient(true)
|
||||
}
|
||||
|
||||
val result = resolvable.resolutionResult
|
||||
val allDependencies = result.allDependencies
|
||||
val resolvedDependencies = allDependencies.mapNotNull {
|
||||
if (it is ResolvedDependencyResult) {
|
||||
return@mapNotNull it
|
||||
}
|
||||
if (it is UnresolvedDependencyResult) {
|
||||
logger.warn("Dependency {} of {} not resolved:", it.attempted, it.from, it.failure)
|
||||
} else {
|
||||
logger.warn(
|
||||
"Dependency {} of {} not resolved: Unexpected result class {}\n{}",
|
||||
it.requested,
|
||||
it.from,
|
||||
it::class,
|
||||
it
|
||||
)
|
||||
}
|
||||
null
|
||||
}
|
||||
|
||||
val g: Graph<ResolvedComponentResult, ResolvedDependencyResult> = DefaultDirectedGraph(ResolvedDependencyResult::class.java)
|
||||
|
||||
|
||||
fun isModule(p: ResolvedComponentResult): Boolean {
|
||||
val projectPath = (p.id as? ProjectComponentIdentifier)?.projectPath
|
||||
return projectPath?.run {
|
||||
startsWith(":modules:") || equals(":engine")
|
||||
} ?: false
|
||||
}
|
||||
|
||||
result.allComponents
|
||||
.filter(::isModule)
|
||||
.forEach { g.addVertex(it) }
|
||||
|
||||
result.allDependencies
|
||||
.mapNotNull {
|
||||
it as? ResolvedDependencyResult
|
||||
}
|
||||
.filter {
|
||||
isModule(it.from) && isModule(it.selected)
|
||||
}
|
||||
.forEach {
|
||||
g.addEdge(it.from, it.selected, it)
|
||||
}
|
||||
|
||||
val nodes = TopologicalOrderIterator(g)
|
||||
return nodes.asSequence()
|
||||
.mapNotNull { it.id as? ProjectComponentIdentifier }
|
||||
.map { it.projectName }
|
||||
.toList().asReversed()
|
||||
}
|
||||
|
|
|
@ -3,11 +3,13 @@
|
|||
|
||||
import org.terasology.gradology.JAR_COLLECTION
|
||||
import org.terasology.gradology.moduleDependencyArtifacts
|
||||
import org.terasology.gradology.moduleDependencyOrdering
|
||||
import org.terasology.gradology.namedAttribute
|
||||
|
||||
plugins {
|
||||
id("terasology-repositories")
|
||||
`java-platform`
|
||||
`project-report`
|
||||
}
|
||||
|
||||
@Suppress("PropertyName")
|
||||
|
@ -67,3 +69,9 @@ tasks.named("clean").configure {
|
|||
cleanModules.dependsOn(this.tasks.named("clean"))
|
||||
}
|
||||
}
|
||||
|
||||
val reportModuleOrder by tasks.registering {
|
||||
moduleDependencyOrdering(configurations.getByName("classpath")).forEach {
|
||||
println(it)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue