Dan
Dan

Reputation: 741

Extract sub-project names from multi-module project

I am trying to extract the subproject names from Gradle Multi Module project and put them in an list (i.e. ["services", "shared"] ) for below multi-module project

> gradle -q projects

------------------------------------------------------------
Root project 'multiproject'
------------------------------------------------------------

Root project 'multiproject'
+--- Project ':services'
\--- Project ':shared'

To see a list of the tasks of a project, run gradle <project-path>:tasks
For example, try running gradle :api:tasks

So far I have created a gradle task and I am getting details, but I could not able extract the project name out of DefaultProject_Decorated, I tried to look in gradle doc but of not that much help.

task('extractSubprojectName') {
    def subProjects = []

    println rootProject.getSubprojects() // [project :'services', project :'shared']
    println rootProject.getSubprojects().getClass() // class java.util.TreeSet

    rootProject.getSubprojects().each { module -> 
        println "Module : " + module // Module : project :'services'
        println "Module Class: " + module.getClass() // Module Class: org.gradle.api.internal.project.DefaultProject_Decorated

        // I am trying to achieve something like below 
        // subProjects.add(module.getProjectName()) // of course getProjectName() is madeup name which doesn't exits in DefaultProject_Decorated

       // - business requirement on subProjects - 
    }
}

Hoping if there is any better solution for it ? or else I have to add logic to convert it to string type and then extract the name out of it.

Upvotes: 0

Views: 1319

Answers (2)

Saik Caskey
Saik Caskey

Reputation: 500

I had a similar issue where I needed to get the "full name", for a :feature:module situation. I needed to use getPath / path to get what I was interested in

rootProject.subprojects {
   println(name) // innermodule
   println(displayName) //project ':outermodule:innermodule'
   println(path) // :outermodule:innermodule
}

For your purposes, maybe you need to call something like this?

val subProjectNames = rootProject.subprojects.map { it.path }
subProjectNames.forEach(::println)

Upvotes: 0

CH Liu
CH Liu

Reputation: 1884

From its source code, getName might be what you want:

tasks.register("zz") {
    doLast {
        println rootProject.getSubprojects()
        println rootProject.getSubprojects().getAt(0).getName()
        println rootProject.getSubprojects().getAt(0).getName().getClass()
    }
}
$ ./gradlew zz

> Task :zz
[project ':aa', project ':bb']
aa
class java.lang.String

BUILD SUCCESSFUL in 684ms
1 actionable task: 1 executed

Upvotes: 0

Related Questions