按顺序对子项目执行gradle任务

时间:2018-02-07 18:11:51

标签: gradle

我们有一个项目结构

ParentProject
    projA
    projB
    projC
    projD
    ...

我们从父项目中运行这些项目的一系列任务,调用gradle clean build make tag push remove

clean: removes the build directory for each project
build: compiles the source code
make: uses the compiled code to create a docker image (custom task)
tag: tags the docker image (custom task)
push: pushes the tagged docker image to our nexus repo (custom task)
remove: removes the local docker image (custom task)

所有任务都按预期工作,但不完全符合我们想要的顺序。

我们的问题是磁盘空间。创建所有的docker镜像(我们有许多可以制作)需要几千兆字节的空间。 Gradle失败,因为它在到达末尾之前耗尽了磁盘空间。我们认为我们可以通过简单地在推送图像后移除图像并释放磁盘空间来解决此问题,但是gradle运行的方式不起作用。

当前,gradle以下列方式执行:

projA:clean
projB:clean
projC:clean
...
projA:build
projB:build
projC:build
...
projA:make
projB:make
projC:make
...
像这样经历,所有事情都会在删除之前尝试构建。我们想要运行gradle的方式如下:

projA:clean
projA:build
projA:make
projA:tag
projA:push
projA:remove
projB:clean
projB:build
projB:make
projB:tag
projB:push
projB:remove
...
通过这种方式,项目可以自行清理并在下一个项目开始构建之前释放磁盘空间。

有没有办法做到这一点?

编辑:有时可能不需要运行每个任务。图像可能已经构建,只需要重新标记。或者可能需要构建用于本地测试,但不能标记或推送。

2 个答案:

答案 0 :(得分:0)

似乎任务maketagpushremove是自定义任务。

如果你想要任务之间的依赖关系,比如taskX应该在taskY启动时执行,那么你应该使用task的dependsOn属性。它也被称为任务依赖。

下面的

显示了projA的build.gradle任务取决于projA的make任务的父项目clean。你应该为projA的剩余任务执行此操作。

project('projA') {
 task make(dependsOn: ':projA:build') {
    doLast {
        println 'make'
    }
 }
}

project('projA') {
task build {
    doLast {
        println 'build'
    }
  }
}

... ...

然后你应该继续剩余的项目和剩余的任务。例如,ProjB:clean应取决于projA:remove

project('projB') {
  task clean(dependsOn: ':projA:remove') {
    doLast {
        println 'clean'
    }
 }
}

继续执行项目B和剩余项目中的其他任务。

有关详情,请按此link

答案 1 :(得分:0)

我们发现我们可以创建一个“GradleBuild”类型的任务,我们可以在其中指定我们想要在一个任务中运行的任务。

task deploy(type: GradleBuild){
  tasks = ['clean','build','make','tag','push','remove']
}

此解决方案可防止任务与依赖项链接,因此我们仍可单独构建子项目,而无需担心其他任务不必要地运行。