Gradle 梯度复制任务首次不从临时文件夹复制文件
我有一个构建文件,可以运行类似这样的任务 任务1(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任务
解压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”的右下方将起作用。