gpt4 book ai didi

groovy - 在 Gradle 中展平 FileTree 的第一个目录

转载 作者:行者123 更新时间:2023-12-01 02:12:44 26 4
gpt4 key购买 nike

我正在编写一个将 tarball 提取到目录中的任务。我不控制这个 tarball 的内容。

tarball 包含一个目录,其中包含我真正关心的所有文件。我想从该目录中提取所有内容并将其复制到我的目的地。

例子:

/root/subdir
/root/subdir/file1
/root/file2

期望:
/subdir
/subdir/file1
/file2

这是我迄今为止尝试过的方法,但这似乎是一种非常愚蠢的方法:
copy {
eachFile {
def segments = it.getRelativePath().getSegments() as List
it.setPath(segments.tail().join("/"))
return it
}
from tarTree(resources.gzip('mytarfile.tar.gz'))
into destinationDir
}

对于每个文件,我获取其路径的元素,删除第一个,将其加入 / ,然后将其设置为文件的路径。这工作......有点。问题是这会产生以下结构:
/root/subdir
/root/subdir/file1
/root/file2
/subdir
/subdir/file1
/file2

作为任务的最终操作,我可以自己删除根目录,但我觉得应该有一种更简单的方法来执行此操作。

最佳答案

AFAIK,唯一的方法是解压 zip、tar、tgz 文件:(

有一个 Unresolved 问题 here
请去投票吧!

在那之前,解决方案不是很漂亮,但也不是那么难。在下面的示例中,我假设您要从仅包含 apache-tomcat zip 文件的“tomcat”配置中删除“apache-tomcat-XYZ”根级目录。

def unpackDir = "$buildDir/tmp/apache.tomcat.unpack"
task unpack(type: Copy) {
from configurations.tomcat.collect {
zipTree(it).matching {
// these would be global items I might want to exclude
exclude '**/EMPTY.txt'
exclude '**/examples/**', '**/work/**'
}
}
into unpackDir
}

def mainFiles = copySpec {
from {
// use of a closure here defers evaluation until execution time
// It might not be clear, but this next line "moves down"
// one directory and makes everything work
"${unpackDir}/apache-tomcat-7.0.59"
}
// these excludes are only made up for an example
// you would only use/need these here if you were going to have
// multiple such copySpec's. Otherwise, define everything in the
// global unpack above.
exclude '**/webapps/**'
exclude '**/lib/**'
}

task createBetterPackage(type: Zip) {
baseName 'apache-tomcat'
with mainFiles
}
createBetterPackage.dependsOn(unpack)

关于groovy - 在 Gradle 中展平 FileTree 的第一个目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27947437/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com