Gradle 依赖于其他任务输出的渐变任务?

Gradle 依赖于其他任务输出的渐变任务?,gradle,Gradle,我有一个自定义任务,它依赖于installDist——不仅用于执行,还依赖于installDist输出: project.task('run', type: JavaExec, dependsOn: 'installDist', overwrite: true) { def libdir = new File("$project.tasks.installDist.destinationDir/lib") ... 在第一次运行时,libdir不会捕获installDist的目标

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

project.task('run', type: JavaExec, dependsOn: 'installDist', overwrite: true) {
    def libdir = new File("$project.tasks.installDist.destinationDir/lib")
    ...
在第一次运行时,
libdir
不会捕获
installDist
的目标目录,这是因为Gradle是如何工作的。既然我的任务需要使用
libdir
,我如何等待installDist完成,然后再运行我的任务


我知道我可以在执行任务之前显式运行
installDist
,但我只想在
clean
之后运行任务。

任务生命周期有点混乱。Gradle读取整个文件,并在实际执行任务之前尝试配置任务。有关生命周期的更多信息,请查看上的示例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")
        }    
    }
}

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

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

因此,这发生在执行任务之前,但在执行
installDist
之后。

实际上
doFirst
是解决方案。我知道使用doLast,但这不起作用,因为我需要在任务执行之前使用lib dir,而不是在任务执行之后。你能更新注释以便我能将其标记为@crmk_Гcrmk_Ahh好的,那么你刚才在doFirst中调用了installDist吗?不,只是在
def libdir
块上使用了doFirst。无需显式调用javaexec@crmk_ГБcrmk_ahhOK。其实我并没有帮上忙,我不应该因此而得到任何赞扬。用你自己的答案来解释答案,我会投赞成票:)不用担心,只要有一个对其他人有效的答案就行了。非常感谢。