2016-11-09 1 views
1

누군가 내가 잘못하고있는 것을 알고 있으면 감사히 생각합니다.지루한 복사 작업이 임시 폴더에서 파일을 처음으로 복사하지 않음

이와 같은 작업을 실행하는 빌드 파일이 있습니다.

작업 1 (unpackWar는) : Temp 폴더에 war 파일 압축을 풀고

작업 2 (copyWarFilesToWebContent) :

작업 3 (copyRequiredJarFilesToWebContent가) 일부 제외와 복사의 WebContent 폴더에 파일을 : 항아리의 몇 가지 압축을 풀고 TempJarDir에 온도/WEB-INF/lib 디렉토리의 파일

작업 4 (explodeProductJars) : 파일을 복사 우리는 폴더를 웹 콘텐츠에 TempJarDir에서 원하는

t의 각 실행하는 하나의 준비 작업이 있습니다

dependsOn을 사용하여 작업을 수행하고 mustRunAfter 명령을 각 작업에 추가하여 순서대로 실행합니다. 또한 각 작업에 대해 upToDateWhen = false를 설정하십시오.

작업 1은 정상적으로 실행되고 전쟁을 압축 해제합니다. 그런 다음 Task 2는 Temp의 파일을 사용하고 WebContent에 필요한 파일을 올바르게 추가합니다.

작업 3과 작업 4는 지정된 디렉터리에서 작동 할 파일이 없기 때문에 항상 최신 날짜로 되돌아갑니다.

임시 폴더가있을 때 준비를 다시 실행하면 작업 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를 사용하여 실행했습니다. 메시지는 내가 처리 할 파일이 없거나 그 정도까지는 없다는 것을 기억할 수 있다는 점에서 조금 비현실적이다. Davids는 왜 파일을 볼 수 없었는지 명확히 밝혀 냈습니다. 나는 그 작업을 실행할 때 구성 단계가 동시에 각 작업을 처리하므로 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'의 바로 아래에서 작동합니다. –

관련 문제