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



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

subprojects {
    apply plugin: 'java'
    ...

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

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

现在我需要一个任务发布,它将

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

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

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

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

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

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

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-')}
}

然后改为指代subprojects,到处都使用javaModules!例如:

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

task prj {
    dependsOn javaModules().build
}

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

最新更新