Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Execute gradle task on sub projects

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.

like image 894
Nathan Case Avatar asked Oct 22 '14 14:10

Nathan Case


People also ask

What is subproject in Gradle?

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.

What is buildSrc in Gradle?

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.


2 Answers

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 :)

like image 93
Mark Fisher Avatar answered Sep 20 '22 21:09

Mark Fisher


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.

like image 27
Marwin Avatar answered Sep 20 '22 21:09

Marwin