eclipsegradlebuildship

How to allow / workaround nested composite Gradle builds


I'm running into the same issue as reported here:

I have a Java project A which depends on project B (module), and project B dependes on project C (another module). For project A I would like to setup "includeBuild ../projectB" and for project B I would like too setup "includeBuild ../projectC" so that I could develop everything in Eclipse + Buildship 2.0 without the need to run Gradle for every small change in each of the projecta A, B and C.

But if I setup this I get: "Included build '%s' cannot have included builds.".

Expected Behavior

Recursive "includeBuild" would recursively include dependent projects.

Current Behavior

I get "Included build '%s' cannot have included builds.".

Your Environment

Gradle 3.5, Buildship 2.0, Eclipse 3.6

How can I resolve / work around this issue? In my instance, I have utility project that includes email functionality (using JavaMail). The email functionality is needed in the data project and a UI project. The UI project also depends on the data project.


Solution

  • Adding another answer for a different approach...

    Each settings.gradle could add a check to before includeBuild to see if it's already inside a composite. If it's already inside a composite, it doesn't includeBuild.

    See here for extra info on the composite check

    Eg

    project2/settings.gradle

    boolean inComposite = gradle.parent != null
    if (!inComposite) {
        includeBuild '../project1'
    }
    

    project3/settings.gradle

    boolean inComposite = gradle.parent != null
    if (!inComposite) {
        includeBuild '../project1'
        includeBuild '../project2'
    }
    

    project4/settings.gradle

    boolean inComposite = gradle.parent != null
    if (!inComposite) {
        includeBuild '../project1'
        includeBuild '../project2'
        includeBuild '../project3'
    }
    

    etc etc

    Using this approach you could run gradle from wherever you like and it should behave as expected (ie substitute dependencies with local projects)