2015-11-03 69 views
1

我們有一個可選的gradle任務docker,它取決於任務war,如果執行該任務,需要使用其中的額外文件生成的war文件。這個額外的文件可以被添加到processResources任務中的資源(或直接在war任務中)。但是,如果任務docker未被請求且不會運行,則相應的代碼塊不能運行。gradle.processResources中的代碼塊是否有其他任務被請求

我們需要一個正確的條件在以下塊檢查,如果任務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之前,然而,這樣的構造對於這樣一個簡單的事情將導致更少的清晰度。

回答

0

您可以簡單地爲docker任務添加附加依賴項,以使其不僅依賴於build任務,還依賴於processResources。在這種情況下,只有在應執行docker時纔會調用您的processResources任務。

另一種解決方案是使用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' 
     } 
} 

此外,您可以嘗試配置您的自定義任務,使之通過設置禁用啓用屬性設置爲false,如果docker任務是不是在執行圖。在這種情況下,您不必在執行階段提供一些標誌和邏輯。像:

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 
     } 
} 

但是,如果沒有一些額外的配置,將無法單獨運行此自定義任務。

+0

感謝您的回答。您能否請您根據我的問題添加到您的提示中,並在必要時進行更新。如果我理解正確,保留任務並且僅使代碼塊有條件的最優雅的解決方案是使用通過TaskExecutionGraph初始化的標誌。會嘗試讓知道。 –

+0

@Oleg這個標誌有一個問題,它只在執行階段可用,但是你的任務很像複製任務,你提供的邏輯是在配置階段執行的。我想,根據你在最新的問題中的說明,最好的解決方案是將它分成2個任務,並在圖形準備就緒後禁用其中的一個,就像在最後一個例子中完成的那樣。只要不要忘記在任務上方留下評論,即可能在其他地方禁用該評論。當然,如果你能夠將你的邏輯轉移到執行階段,那麼flag就是解決方案 – Stanislav

相關問題