在子项目上执行gradle任务

时间:2014-10-22 14:07:22

标签: gradle build.gradle multi-module

我正在尝试配置一个MultiModule gradle项目。

Root
    projA
    projB
    other
        projC
        projD
        projE
        ...

希望我能够做的是在root build.gradle中有一个任务,它将在另一个目录中的每个项目中执行buildJar任务。

我知道我能做到

configure(subprojects.findAll {it.name != 'tropicalFish'}) {
    task hello << { task -> println "$task.project.name"}
}

但这也会得到projA和projB,我只想在c,d,e上运行任务... 请告诉我实现这一目标的最佳方法。

3 个答案:

答案 0 :(得分:44)

不完全确定您之后的哪一项,但它们应该涵盖您的基础。

<强> 1。直接调用任务

您应该可以致电

gradle :other/projC:hello :other/projD:hello

我测试了这个:

# Root/build.gradle
allprojects {
    task hello << { task -> println "$task.project.name" }
}

# Root/settings.gradle
include 'projA'
include 'projB'
include 'other/projC'
include 'other/projD'

<强> 2。仅在子项目中创建任务

或者您只想在其他/ *项目上创建任务吗?

如果是后者,那么以下工作:

# Root/build.gradle
allprojects {
    if (project.name.startsWith("other/")) {
        task hello << { task -> println "$task.project.name" }
    }
}

然后可以通过以下方式调用它:

$ gradle hello
:other/projC:hello
other/projC
:other/projD:hello
other/projD

第3。创建仅在子项目中运行任务的任务

此版本与我对您的问题的解读相符,这意味着已经在子项目(buildJar)上执行了任务,并在root中创建了一个只调用子项目的任务/ *:buildJar

allprojects {
    task buildJar << { task -> println "$task.project.name" }
    if (project.name.startsWith("other/")) {
        task runBuildJar(dependsOn: buildJar) {}
    }
}

这会创建一个任务&#34; buildJar&#34;在每个项目上,&#34; runBuildJar&#34;仅在其他/ *项目上,因此您可以致电:

$ gradle runBuildJar
:other/projC:buildJar
other/projC
:other/projC:runBuildJar
:other/projD:buildJar
other/projD
:other/projD:runBuildJar

您的问题可以通过多种方式阅读,希望这涵盖所有方面:)

答案 1 :(得分:37)

我今天发现了这个问题因为我有同样的问题。可以使用Mark提到的所有方法,但所有方法都有一些缺点。所以我再添加一个选项:

<强> 4。切换当前项目

gradle -p other hello

这会切换&#34;当前项目&#34;然后在当前项目下运行名为hello的所有任务。

答案 2 :(得分:0)

示例5.定义所有项目和子项目的共同行为,

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

从Gradle文档中, https://docs.gradle.org/current/userguide/multi_project_builds.html