I have a MultiModule gradle project that I am trying to configure.
Root projA projB other projC projD projE ...
What I want to be able to do is have a task in the root build.gradle which will execute the buildJar task in each of the projects in the other directory.
I know I can do
configure(subprojects.findAll {it.name != 'tropicalFish'}) { task hello << { task -> println "$task.project.name"} }
But this will also get projA and projB, I want to only run the task on c,d,e... Please let me know the best way to achieve this.
In a multi-project gradle build, you have a rootProject and the subprojects. The combination of both is allprojects. The rootProject is where the build is starting from. A common pattern is a rootProject has no code and the subprojects are java projects.
buildSrc is a separate build whose purpose is to build any tasks, plugins, or other classes which are intended to be used in build scripts of the main build, but don't have to be shared across builds.
Not entirely sure which of these you're after, but they should cover your bases.
1. Calling the tasks directly
You should just be able to call
gradle :other/projC:hello :other/projD:hello
I tested this with:
# Root/build.gradle allprojects { task hello << { task -> println "$task.project.name" } }
and
# Root/settings.gradle include 'projA' include 'projB' include 'other/projC' include 'other/projD'
2. Only creating tasks in the sub projects
Or is it that you only want the task created on the other/* projects?
If the latter, then the following works:
# Root/build.gradle allprojects { if (project.name.startsWith("other/")) { task hello << { task -> println "$task.project.name" } } }
and it can then be called with:
$ gradle hello :other/projC:hello other/projC :other/projD:hello other/projD
3. Creating a task that runs tasks in the subprojects only
This version matches my reading of your question meaning there's already a task on the subprojects (buildJar), and creating a task in root that will only call the subprojects other/*:buildJar
allprojects { task buildJar << { task -> println "$task.project.name" } if (project.name.startsWith("other/")) { task runBuildJar(dependsOn: buildJar) {} } }
This creates a task "buildJar" on every project, and "runBuildJar" on the other/* projects only, so you can call:
$ gradle runBuildJar :other/projC:buildJar other/projC :other/projC:runBuildJar :other/projD:buildJar other/projD :other/projD:runBuildJar
Your question can be read many ways, hope this covers them all :)
I found this question today because I have the same issue. All of the ways mentioned by Mark can be used but all of them have some cons. So I am adding one more option:
4. Switching the current project
gradle -p other hello
This switches the "current project" and then runs all tasks named hello
under the current project.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With