我正在尝试配置一个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上运行任务... 请告诉我实现这一目标的最佳方法。
答案 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