Execute gradle task on sub projects

前端 未结 3 2018
陌清茗
陌清茗 2020-12-23 13:45

I have a MultiModule gradle project that I am trying to configure.

Root
    projA
    projB
    other
        projC
        projD
        projE
        ...         


        
相关标签:
3条回答
  • 2020-12-23 14:11

    Example 5. Defining common behavior of all projects and subprojects,

    allprojects {
        task hello {
            doLast { task ->
                println "I'm $task.project.name"
            }
        }
    }
    subprojects {
        hello {
            doLast {
                println "- I depend on water"
            }
        }
    }
    

    From the Gradle documentation, https://docs.gradle.org/current/userguide/multi_project_builds.html

    0 讨论(0)
  • 2020-12-23 14:20

    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.

    0 讨论(0)
  • 2020-12-23 14:33

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

    0 讨论(0)
提交回复
热议问题