如何使用 Ant include/exclude 模式从 Gradle zip 任务中排除所有子目录?
How do I exclude all subdirectories from Gradle zip task using Ant include/exclude pattern?
我想创建一个任务来压缩目录中的所有文件,忽略所有子目录。同时,我想遍历所有子目录并创建包含这些目录中文件的 zip(并忽略任何其他子目录)。
因此,对于此目录结构,我需要以下 zips:
$ls build/dirA
fileA
dirB
$ls build/dirA/dirB
fileB
I should get zip/zipA containing fileA, zip/zipB containing fileB.
我正在使用基于此处答案的代码: 本质上,我为要创建的每个 zip 工件创建一个 zip 任务,依赖于顶级任务。
task myZip() {
file('build').eachDir { dir ->
dir.eachDir { sub ->
dependsOn tasks.create("zip$sub.name", Zip) {
from sub
baseName sub.name
destinationDir file('zip')
}
}
dependsOn tasks.create("zip$dir.name", Zip) {
from dir
baseName dir.name
excludes ['*/**']
destinationDir file('zip')
}
}
}
问题似乎出在排除模式中。我得到了子目录的正确 zip,但父目录包括 fileA
和 dirB/fileB
.
请问正确的做法是什么?
*注意我没有排除子目录的迭代,因为我认为这个模式需要与父目录相同,我还没有弄清楚。
您可以尝试以下脚本,它会解决您的问题:
import static groovy.io.FileType.DIRECTORIES
task myZip {
file('folder').traverse(type: DIRECTORIES) {
def path = it.path
def zipFile = it.name + '.zip'
ant.zip(destfile: zipFile){
fileset(dir: path) {
include (name: "*")
type (type: "file")
}
}
}
doLast {
copy {
from "."
include "*.zip"
into file("zip")
}
}
}
这是一些示例测试:
$ tree folder
folder
└── dirA
├── dirB
│ ├── dirC
│ │ ├── dirD
│ │ └── fileC
│ └── fileB
└── fileA
4 directories, 3 files
并生成三个 zip 文件到 zip 文件夹和根文件夹中。
$ ls -1 zip/
dirA.zip
dirB.zip
dirC.zip
我想创建一个任务来压缩目录中的所有文件,忽略所有子目录。同时,我想遍历所有子目录并创建包含这些目录中文件的 zip(并忽略任何其他子目录)。
因此,对于此目录结构,我需要以下 zips:
$ls build/dirA
fileA
dirB
$ls build/dirA/dirB
fileB
I should get zip/zipA containing fileA, zip/zipB containing fileB.
我正在使用基于此处答案的代码:
task myZip() {
file('build').eachDir { dir ->
dir.eachDir { sub ->
dependsOn tasks.create("zip$sub.name", Zip) {
from sub
baseName sub.name
destinationDir file('zip')
}
}
dependsOn tasks.create("zip$dir.name", Zip) {
from dir
baseName dir.name
excludes ['*/**']
destinationDir file('zip')
}
}
}
问题似乎出在排除模式中。我得到了子目录的正确 zip,但父目录包括 fileA
和 dirB/fileB
.
请问正确的做法是什么?
*注意我没有排除子目录的迭代,因为我认为这个模式需要与父目录相同,我还没有弄清楚。
您可以尝试以下脚本,它会解决您的问题:
import static groovy.io.FileType.DIRECTORIES
task myZip {
file('folder').traverse(type: DIRECTORIES) {
def path = it.path
def zipFile = it.name + '.zip'
ant.zip(destfile: zipFile){
fileset(dir: path) {
include (name: "*")
type (type: "file")
}
}
}
doLast {
copy {
from "."
include "*.zip"
into file("zip")
}
}
}
这是一些示例测试:
$ tree folder
folder
└── dirA
├── dirB
│ ├── dirC
│ │ ├── dirD
│ │ └── fileC
│ └── fileB
└── fileA
4 directories, 3 files
并生成三个 zip 文件到 zip 文件夹和根文件夹中。
$ ls -1 zip/
dirA.zip
dirB.zip
dirC.zip