2016-11-09 8 views
1

誰かが私が間違っていることを知っていれば、私はそれを感謝します。一時的なフォルダーからファイルをコピーしていないときにコピーするタスク

このようなタスクを実行するビルドファイルがあります。

タスク1(unpackWar):Tempフォルダにwarファイルを解凍し

タスク2(copyWarFilesToWebContent):一部除外

タスク3(copyRequiredJarFilesToWebContent)とのWebContentフォルダーにコピーしたファイルを:jarファイルのカップルを解凍し温度/ WEB-INF/libにからTempJarDir

タスク4のファイル(explodeProductJars):私たちが望むファイルをコピーしますTempJarDirからWebContentフォルダーに

トンのそれぞれを実行し、単一の準備作業がありますdependsOnを使用してタスクを監視し、各タスクにmustRunAfterコマンドを追加して順番に実行するようにしました。また、各タスクに対してupToDateWhen = falseを設定します。

タスク1はうまく動作し、戦争を解凍するということが起こりそうです。タスク2はTempのファイルを使用し、必要なものをWebContentに正しく追加します。

タスク3とタスク4は、指定されたディレクトリで動作するファイルが存在しないように見えるため、常に最新の状態に戻ります。

Tempフォルダが存在するときに準備を再実行すると、タスク3と4が正しく動作します。

これは、fileTreeの動作や私が間違っていることが原因であるかどうかはわかりません。私は約1週間前にgradleをピックアップして、それを把握しています。

ありがとうございました。

タスクは次のようになります。私はfileTreeを行うために、その何かを感じますが、正確に起こっていただきましたわからないました

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

ねえ、これは私の問題を解決した。助けてくれてありがとう。 私はあなたが答えるかもしれないが、フォローアップの質問があります。 copyメソッドのアプローチで何らかの方法でincludeEmptyDirs = falseを設定することは可能ですか? – Predz

+0

@Predz 喜んで助けました。単にタスクにincludeEmptyDirs = falseを追加することができます。たとえば、 'WebContent'のすぐ下には機能します。 –

関連する問題