Gradle任务取决于其他任务输出?

时间:2016-01-19 13:34:34

标签: gradle

我有一个依赖于installDist的自定义任务 - 不仅用于执行,还用于installDist输出:

project.task('run', type: JavaExec, dependsOn: 'installDist', overwrite: true) {
    def libdir = new File("$project.tasks.installDist.destinationDir/lib")
    ...

当第一次运行时,由于Gradle的工作方式,libdir无法捕获installDist的目标目录。由于我需要使用libdir作为我的任务,我如何等待installDist完成,然后运行我的任务?

我知道我可以在任务之前明确地运行installDist,但我想在clean之后运行我的任务。

2 个答案:

答案 0 :(得分:5)

在@Ben Greens回答之后,我想:

project.task('run', type: JavaExec, dependsOn: 'installDist', overwrite: true) {
    doFirst {
        def libdir = new File("$project.tasks.installDist.destinationDir/lib")
...

所以这在我的任务执行之前发生,但在执行installDist之后发生。

答案 1 :(得分:2)

任务生命周期有点令人困惑。 Gradle读取整个文件并尝试在实际执行之前配置任务。有关生命周期的更多信息,请查看https://docs.gradle.org/current/userguide/build_lifecycle.html上的示例20.1中的build.gradle。

为避免这种情况,您可以尝试将相关的任务信息放入doLast块中,如下所示:

task run() {
    dependsOn 'installDist'
    doLast {
        javaexec {
            main = project.mainClassName
            classpath = project.configurations.standaloneRuntime
            def libdir = new File("$project.tasks.installDist.destinationDir/lib")
        }    
    }
}