2017-02-22 73 views
0

警告:Gradle新手... :-)如何修改Gradle複製任務中的文件列表?

我正在將現有項目從Ant轉換爲Gradle。我的項目很大一部分是由生成的代碼組成的。這段代碼被生成到一個內部目錄中,並且完成一個本地構建以確保正確生成代碼。驗證本地測試版本後,將生成的代碼複製到一組WAR項目中進行最終部署。

因此,作爲構建的一部分,我有一個任務將文件從測試版本複製到WAR項目。在製作副本時,有幾個文件只有在目標WAR項目中不存在時才應該複製。要做到這一點,我寫了下面的搖籃副本任務:


task copyServer (type: org.gradle.api.tasks.Copy) { 
    group = 'ds_copy' 

    String serviceRootDir = "${DS_ROOT_DIR}/NDMS_DS_Generated_Services/server_src/${x_dsServiceDir}" 
    String serviceDestDir = "${DS_ROOT_DIR}/NDMS_DS_Client/srv_src/${x_dsServiceDir}" 

    FileTree setupFiles = fileTree ("$serviceRootDir") { 
     include "gen/**/*.java", "request/gen/**.java" 
    } 

    doFirst { 

     File appFile = new File (serviceDestDir, "${dsName}App.java") 

     if (appFile.exists() == false) 
     { 
      setupFiles = fileTree (dir: "$serviceRootDir", include: ["gen/**/*.java", "request/gen/**.java", "${dsName}App.java"]) 
     } 

     println ("Copying service classes for ${dsName} from ${serviceRootDir}") 
     println ("Files to copy: ") 
     setupFiles.each { println (it) } 
     println (setupFiles) 
    } 

    from (setupFiles) 

    into (serviceDestDir) 

    doLast { 
     println ("Finished copying service classes for ${dsName}") 
    } 
} 

我的問題是,我似乎無法從doFirst塊,以使該文件的存在檢查更新文件樹在目的地。即使我看到setupFiles得到更新,當發生複製時,我添加的文件在doFirst塊中不會被複制。

有沒有辦法修改copyTask使用的fileTree?

回答

1

永遠不要試圖從執行階段更改任務的配置,特別是如果這改變了輸入或輸出。這將打破最新的檢查,我認爲Gradle在最近的版本中甚至主動禁止這一點。

進行第二項任務,生成您的文件,然後通過配置使copyServer任務包含該任務的輸出。如果你做得對,你甚至不需要明確的任務依賴關係,因爲它可以隱式添加。

其實您的複製任務應該看上去更像

task copyServer(type: Copy) { 
    group = 'ds_copy' 

    from serviceRootDir 
    into serviceDestDir 
    include 'gen/**/*.java' 
    include 'request/gen/**.java' 
    include "${dsName}App.java" 

    doLast { 
     println "Finished copying service classes for $dsName" 
    } 
} 

順便說一句。一個用於Ant - > Gradle轉換的技巧。學習Gradle,忘記你的Ant構建腳本,用Gradle的Gradle方式從頭開始創建你的構建。如果你嘗試移植你現有的Ant構建,你很可能會得到非常醜陋的Gradle構建,這可能也會比他們的效率低得多。

+0

謝謝。這讓我到了我需要的地方。我沒有考慮到我可以在配置時更改包含的事實。通過在include子句中添加一個if語句,我可以控制添加的內容,就像我之前在執行時試圖執行的那樣... – Steve

+0

如果文件已經存在,不復制文件的用例是什麼? – Vampire

+0

我正在複製文件,如果它不*目前在目的地目錄中(例如appFile.exists()== false) – Steve