Gradle 梯度复制任务首次不从临时文件夹复制文件

Gradle 梯度复制任务首次不从临时文件夹复制文件,gradle,copy,temp,filetree,Gradle,Copy,Temp,Filetree,我有一个构建文件,可以运行类似这样的任务 任务1(解压war):将war文件解压到临时文件夹 任务2(copyWarFilesToWebContent):将文件复制到WebContent文件夹,并进行一些排除 任务3(copyrequiredjarfilestoebcontent):将两个jar文件从Temp/WEB-INF/lib解压到TempJarDir 任务4(explodeProductJars):将所需文件从TempJarDir复制到WebContent文件夹 有一个prepare任务

我有一个构建文件,可以运行类似这样的任务

任务1(
解压war
:将war文件解压到临时文件夹

任务2(
copyWarFilesToWebContent
:将文件复制到WebContent文件夹,并进行一些排除

任务3(
copyrequiredjarfilestoebcontent
:将两个jar文件从Temp/WEB-INF/lib解压到TempJarDir

任务4(
explodeProductJars
:将所需文件从TempJarDir复制到WebContent文件夹

有一个prepare任务,它使用dependsOn运行这些任务中的每一个,我在每个任务中添加了mustRunAfter命令,以便它们按顺序执行。还为每个任务设置upToDateWhen=false

似乎发生的是任务1运行良好,解除了战争。然后,任务2使用Temp中的文件,并将所需文件正确添加到WebContent

任务3和任务4总是以最新状态返回,因为在指定的目录中似乎没有可处理的文件

如果在临时文件夹存在时重新运行“准备”,任务3和4将正确运行

我不确定这是因为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"

}

我觉得这与fileTree有关,但不确定到底发生了什么。

复制任务很棘手。复制任务只有在配置阶段找到要复制的内容时才会执行。如果在该阶段中未找到任何内容,则将跳过它

您可以使用而不是复制任务

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'
    }
}
prepare(dependsOn:'copyrequiredjarfilestowbcontent'){
任务解包(类型:复制){
def warFile=file(warFileLocation)
来自zipTree(warFile)
进入“临时”
}

任务copywarfilestoebcontent(dependsOn:unpackWar)您是否考虑过使用
--debug
--info
来运行gradle任务,以查看其作用?也许在您的问题中包含日志?我已经使用--debug--info和--stacktrace运行了。这些信息有点隐晦,因为据我回忆,它说没有要处理的文件或类似的东西。戴维斯在下面的回答澄清了为什么它没有看到这些文件。我相信这是因为当我运行任务时,配置阶段同时处理每个任务,因此临时文件夹还不存在,这意味着任务被标记为最新。这个想法有待修正嘿,这解决了我的问题。谢谢你的帮助。我还有一个问题,也许你可以回答。是否可以通过复制方法以某种方式将includeEmptyDirs=false设置为false?@Predz很高兴它起到了作用。只需将includeEmptyDirs=false添加到任务中即可。例如,在“WebContent”的右下方将起作用。