Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gradle 在子项目上执行梯度任务_Gradle_Build.gradle_Multi Module - Fatal编程技术网

Gradle 在子项目上执行梯度任务

Gradle 在子项目上执行梯度任务,gradle,build.gradle,multi-module,Gradle,Build.gradle,Multi Module,我正在尝试配置一个多模块gradle项目 Root projA projB other projC projD projE ... 我希望能够在root build.gradle中有一个任务,它将在另一个目录中的每个项目中执行buildJar任务 我知道我能行 configure(subprojects.findAll {it.name != 'tropicalFish'}) { task hell

我正在尝试配置一个多模块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"}
}
configure(subprojects.findAll{it.name!='tropicalFish'}){
任务hello println“$task.project.name”}
}
但这也会得到projA和projB,我只想在c,d,e上运行任务。。。
请让我知道实现这一目标的最佳方法。

不完全确定您所追求的是哪一个,但它们应该涵盖您的基础

1。直接调用任务

你应该可以打个电话

gradle :other/projC:hello :other/projD:hello
我用以下方法对此进行了测试:

# Root/build.gradle
allprojects {
    task hello << { task -> println "$task.project.name" }
}
2。仅在子项目中创建任务

还是您只希望在其他/*项目上创建任务

如果是后者,则以下操作有效:

# Root/build.gradle
allprojects {
    if (project.name.startsWith("other/")) {
        task hello << { task -> println "$task.project.name" }
    }
}
3。创建仅在子项目中运行任务的任务

这个版本与我对您的问题的理解相匹配,这意味着子项目(buildJar)上已经有一个任务,并且在root中创建了一个任务,该任务将只调用子项目other/*:buildJar

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

你的问题可以从很多方面来理解,希望这能涵盖所有方面:)

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

4。切换当前项目

gradle -p other hello

这将切换“当前项目”,然后运行当前项目下名为
hello
的所有任务。

示例5。定义所有项目和子项目的通用行为

allprojects {
    task hello {
        doLast { task ->
            println "I'm $task.project.name"
        }
    }
}
subprojects {
    hello {
        doLast {
            println "- I depend on water"
        }
    }
}
从Gradle文档中,

谢谢你的回答。没有一个选项适合我的需要:1。我们需要知道所有子项目的列表。2+3. 需要修改生成脚本。最后,我找到了实现这一点的另一种方法,并将其作为一个新的答案添加进去。@Marwin:你的答案在哪里?会感兴趣的。@frhd看到我下面的答案
gradle-p other hello
需要注意的是,这会将工作目录切换到“other”。因此,如果没有'other/build.gradle'文件(我们使用父目录中的“subprojects{…}”来配置子项目),则此操作将失败。这就是为什么我推荐另一个答案,并使用“gradle:taskName”代替。
$ gradle runBuildJar
:other/projC:buildJar
other/projC
:other/projC:runBuildJar
:other/projD:buildJar
other/projD
:other/projD:runBuildJar
gradle -p other hello
allprojects {
    task hello {
        doLast { task ->
            println "I'm $task.project.name"
        }
    }
}
subprojects {
    hello {
        doLast {
            println "- I depend on water"
        }
    }
}