2016-11-09 51 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'的下面会起作用。 –

相关问题