Gradle批处理任务按顺序调用子项目和其他任务

时间:2013-01-30 12:41:03

标签: gradle

我正在为multimodule项目编写gradle 1.4 build文件。所以有根 build.gradle 定义了类似的东西:

subprojects {
    apply plugin: 'java'
    ...

为所有子模块定义构建任务。子模块包含在 settings.gradle 中,每个模块的构建文件都有定义的依赖项。

到目前为止,所有内容都是如此:)现在,在主构建文件中,我添加了一些额外的项目范围任务,例如: aggregateJavadoc (将所有javadoc收集到一个)或 bundleJar (从所有类创建捆绑jar)等等。每个人都在手动调用时工作。

现在我需要一个发布

的任务

  • 构建所有子模块(从命令行调用 - 意思是,我不想为每个子模块手动编写execute())

  • 调用其他任务(使用我认为的execute())。

我尝试依赖,但未遵循列出的任务的顺序。此外,依赖模块似乎在发布任务执行后执行。我尝试了其他几个想法并且失败了。

问题:创建此类批处理任务的最佳方法是什么,必须在所有子模块上调用某些内容并执行更多任务?什么是最好的gradle友好解决方案?感谢名单!

1 个答案:

答案 0 :(得分:10)

碰巧这可以通过简单的依赖管理来解决。

所以,我们有很多模块。现在,让我们创建依赖于正在构建的模块的其他任务:

task aggregateJavadoc(type: Javadoc) {
    dependsOn subprojects.build

task bundleJar(type: Jar) {
    dependsOn subprojects.build

最后,我们的release任务看起来像这样:

task release() {
    dependsOn subprojects.build
    dependsOn aggregateJavadoc
    dependsOn bundleJar
    ...
}

这将首先建立子项目;不是因为它首先列出,而是因为其他任务取决于构建。额外任务的顺序并不重要。这对我来说是最有意义的。

EDIT 如果您的某个子项目(即模块)是非Java模块,那么构建此项目时将遇到问题。我所做的是将子模块分组,如下所示:

def javaModules() {
    subprojects.findAll {it.name.contains('jodd-')}
}

然后转而引用subprojects,到处使用javaModules!例如:

configure(javaModules()) {
    apply plugin: 'java'
    ...

task prj {
    dependsOn javaModules().build
}

顺便说一下,我正在prj使用这个'虚拟'任务dependsOn来处理依赖于构建的所有其他项目,以防止重复。