2016-11-09 90 views
1

如果有人知道我在做什麼錯在這裏,我會很感激。第一次從臨時文件夾中複製文件的Gradle複製任務

我有一個運行這樣的任務的構建文件。

任務1(unpackWar):解壓縮war文件到臨時文件夾

任務2(copyWarFilesToWebContent):將文件複製到WebContent文件夾一些排除

任務3(copyRequiredJarFilesToWebContent):解壓幾個罐子從溫度/ WEB-INF/lib目錄到TempJarDir文件

任務4(explodeProductJars):複製文件,我們從TempJarDir要WebContent文件夾

有運行每個T的一個準備工作這些任務使用dependsOn,並且我已經將mustRunAfter命令添加到每個任務,以便按順序執行。還爲每個任務設置了ToDateWhen = false。

什麼似乎發生的是,任務1運行良好,解壓縮戰爭。任務2然後使用Temp中的文件並正確添加所需的文件到WebContent。

任務3和任務4總是回到最新狀態,因爲在指定的目錄中似乎沒有要使用的文件。

如果我在Temp文件夾存在時重新運行準備,任務3和4運行正常。

我不確定這是由於fileTree的工作原理或者我做錯了什麼。大約一週前我已經選擇了Gradle,並且仍然在努力解決它。

感謝您的幫助。

任務是這樣的:

task prepare(dependsOn: ['unpackWar', 'copyWarFilesToWebContent', 'copyRequiredJarFilesToWebContent']) 
prepare.outputs.upToDateWhen {false} 



task unpackWar(type: Copy) { 
    description = 'unzips the war' 
    outputs.upToDateWhen { false } 


    def warFile = file(warFileLocation) 
    from zipTree(warFile) 
    into "Temp" 
} 


task copyWarFilesToWebContent(type: Copy) { 
    mustRunAfter unpackWar 
    description = 'Moves files from Temp to WebContent Folder' 
    outputs.upToDateWhen { false } 

    from ('Temp') { 
     exclude "**/*.class" 
    } 
    into 'WebContent' 
} 

task explodeProductJars(type: Copy) { 
    outputs.upToDateWhen { false } 
    FileTree tree = fileTree(dir: 'Temp/WEB-INF/lib', includes: ['application*-SNAPSHOT-resources.jar', 'services*-SNAPSHOT-resources.jar']) 

    tree.each {File file -> 
     from zipTree(file) 
     into "TempJarDir" 
    } 
} 

task copyRequiredJarFilesToWebContent(type: Copy, dependsOn: explodeProductJars) { 
    mustRunAfter copyWarFilesToWebContent 
    outputs.upToDateWhen { false } 


    from ("TempJarDir/META-INF/resources") { 
     include '**/*.xml' 
    } 
    into "WebContent/WEB-INF" 

} 

我感覺它的東西與文件樹做的,但不知道究竟什麼發生。

+1

你有沒有考慮過使用'--debug'或'--info'來運行gradle任務來看看有什麼關係?也許在你的問題中包含日誌? – frhd

+0

我用--debug --info和--stacktrace運行。這些信息有點神祕,因爲我記得它說沒有任何文件可以處理或者達到某種程度。戴維斯的回答如下,澄清了爲什麼它沒有看到文件。我相信它是因爲當我運行任務時,配置階段同時處理每個任務,所以Temp文件夾不存在,這意味着任務被標記爲最新。打開糾正這個雖然 – Predz

回答

1

複製任務非常棘手。複製任務只有在配置階段發現要複製的內容時纔會執行。如果在這個階段沒有找到任何東西,它將被跳過。您可以使用複製方法而不是複製任務。

prepare(dependsOn: 'copyRequiredJarFilesToWebContent') {} 

task unpackWar(type: Copy) { 

    def warFile = file(warFileLocation) 
    from zipTree(warFile) 
    into 'Temp' 
} 

task copyWarFilesToWebContent(dependsOn: unpackWar) << { 

    copy { 
     from ('Temp') { 
      exclude '**/*.class' 
     } 
     into 'WebContent' 
    } 
} 

task explodeProductJars(dependsOn: copyWarFilesToWebContent) << { 

    copy { 
     FileTree tree = fileTree(dir: 'Temp/WEB-INF/lib', includes: [ 'application*-SNAPSHOT-resources.jar', 'services*-SNAPSHOT-resources.jar' ]) 

     tree.each { File file -> 
      from zipTree(file) 
      into 'TempJarDir' 
     } 
    } 
} 

task copyRequiredJarFilesToWebContent(dependsOn: explodeProductJars) << { 

    copy { 
     from ('TempJarDir/META-INF/resources') { 
      include '**/*.xml' 
     } 
     into 'WebContent/WEB-INF' 
    } 
} 
+0

嘿,這解決了我的問題。謝謝您的幫助。 我有一個後續問題,雖然你可以回答。是否可以通過複製方法設置includeEmptyDirs = false? – Predz

+0

@Predz 很高興幫助。您可以簡單地將includeEmptyDirs = false添加到任務。例如,正好在'WebContent'的下面會起作用。 –

相關問題