2016-01-19 66 views
1

我有依賴於installDist自定義任務 - 不僅執行,還對installDist輸出:依賴其他任務輸出的Gradle任務?

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之後運行我的任務。

回答

3

@Ben綠黨的答案後,我想通:

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

所以出現這種情況之前,我的任務被執行,但在執行installDist之後。

1

任務生命週期有點混亂。 Gradle會讀取整個文件,並在實際執行之前嘗試配置這些任務。查看示例20.1中的build.gradle https://docs.gradle.org/current/userguide/build_lifecycle.html以獲取關於生命週期的更多信息。

爲了避免這種情況,你可以嘗試把培訓相關任務信息爲doLast塊,像這樣:

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

其實'doFirst'是解決方案。我知道doLast,但這不會工作,因爲我需要在任務執行前使用lib dir,而不是之後。你能否更新評論以便我可以將其標記爲 – igr

+0

@игор嗯,好吧,你剛剛在doFirst中調用installDist? –

+0

不,只是在'def libdir'塊中使用了doFirst。沒有顯式調用javaexec – igr

相關問題