9

我正在为多模块项目编写 gradle 1.4 构建文件。所以有根build.gradle定义如下:

subprojects {
    apply plugin: 'java'
    ...

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

到目前为止,一切都按书本:)现在,在主构建文件中,我添加了一些额外的项目范围任务,例如:aggregateJavadoc(将所有 javadocs 收集到一个中)或bundleJar(从所有类创建 bundle jar),等等。手动调用时,每个 on 都可以工作。

现在我需要一个任务发布

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

  • 调用其他任务(我假设使用 execute() )。

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

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

4

1 回答 1

12

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

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

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

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

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

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

这将首先构建子项目;不是因为它被列在最前面,而是因为附加任务取决于构建。附加任务的顺序并不重要。这对我来说最有意义。

编辑如果您的子项目之一(即模块)是非 java 模块,那么您将在构建此项目时遇到问题。我所做的是对子模块进行分组,如下所示:

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

然后改为引用subprojectsjavaModules到处使用!例如:

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

task prj {
    dependsOn javaModules().build
}

顺便说一句,我在所有依赖于构建的其他项目上使用这个“虚拟”任务,以防止重复prjdependsOn

于 2013-01-30T16:35:54.220 回答