如何使用 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,但父目录包括 fileAdirB/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