gradle.processResources中的代码块取决于是否请求了另一个任务

时间:2015-11-03 15:37:46

标签: gradle build.gradle

我们有一个可选的gradle任务docker,它取决于任务war,如果执行该任务,则需要一个使用额外文件生成的war文件。可以将此额外文件添加到processResources任务中的资源(或可能直接添加到war任务中)。但是,如果尚未请求任务docker且不会运行,则不得运行相应的代码块。

我们在以下块中需要正确的条件,检查任务docker是否在管道中:

processResources {
  if (/* CONDITION HERE: task docker is requested */) {
    from ("${projectDir}/docker") {
      include "app.properties"
    }
  }
}

task docker(type: Dockerfile) {
  dependsOn build
  ...

澄清processResourceswar任务的标准依赖关系,后者是build任务的标准依赖关系。 processResources总是在build上执行,无论是否有docker任务都可以收集用于组装战争的资源,在这种情况下可能无法完全禁用。可以将有问题的代码移动到依赖于docker的单独任务并处理processResources的输出目录,但是在运行war之前,这样的构造将导致很多对这么简单的事情不那么清晰。

1 个答案:

答案 0 :(得分:0)

您可以简单地为docker任务添加额外的依赖关系,使其不仅依赖于build任务,还依赖于processResources。在这种情况下,只有在processResources执行时才会调用docker任务。

另一种解决方案是使用TaskExecutionGraph。这可以让你初始化一些变量,它可以告诉你,某个任务是否会被执行。但您必须明白,只有在完成所有配置后才能准备图表,并且只能在执行阶段才能依赖它。这是一个简短的例子,如何使用它:

//some flag, whether or not some task will be executed
def variable = false

//task with some logic executed during the execution phase
task test1 << {
    if (variable) {
        println 'task2 will be executed'
    } else {
        println 'task2 will not be executed'
    }
}

//according to whether or not this task will run or not, 
//will differs test1 task behavior
task test2(dependsOn: test1) {

}

//add some logic according to task execution graph
gradle.taskGraph.whenReady {
    taskGraph ->
        //check the flag and execute only if it's true
        if (taskGraph.hasTask(test2)) {
            variable = true
            println 'task test2 will be executed'
        }
}

此外,如果docker任务不在执行图中,您可以尝试将自定义任务配置为通过将is enabled属性设置为false来禁用它。在这种情况下,您不必在执行阶段提供一些标志和逻辑。像:

task test1 {       
    //some logic for execution
    doLast {
        println "execute some logic"
    }
}

task test2(dependsOn: test1) {

}

gradle.taskGraph.whenReady {
    taskGraph ->
        if (!taskGraph.hasTask(test2)) {
            //Disable test1 task if test2 will not run
            test1.enabled = false
        }
}

但如果没有一些额外的配置,单独运行此自定义任务是不可能的。