如何使用Ant包含/排除模式从Gradle zip任务中排除所有子目录?

时间:2018-01-04 18:16:31

标签: gradle ant

我想创建一个任务,压缩目录中的所有文件,忽略所有子目录。同时,我想遍历所有子目录并创建包含这些目录中文件的zip文件(并忽略任何其他子目录)。

因此,对于这个目录结构,我想要以下拉链:

let resultObj = {};

let array1 = [
  { $key: '1', firstname: 'Ben', lastname: 'Fried', point: 1 },
  { $key: '2', firstname: 'Carlo', lastname: 'Strozzi', point: 5 },
  { $key: '3', firstname: 'Jim', lastname: 'DuBois', point: 8 },
];

let array2 = [
  { $key: '2', firstname: 'Carlo', lastname: 'Strozzi', point: 3 },
  { $key: '4', firstname: 'Larry', lastname: 'Page', point: 10 },
];

for (let i = 0; i < array1.length; i++) {
  resultObj[array1[i].$key] = array1[i];
}

for (let i = 0; i < array2.length; i++) {
  resultObj[array2[i].$key] = array2[i];
}

console.log(Object.values(resultObj));

我正在使用基于答案的代码:gradle task to zip multiple directories independently基本上,我为每个要创建的zip工件创建一个zip任务,并依赖于顶级任务。

$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') } } } fileA

请问这样做的正确方法是什么?

*注意我没有通过子目录对迭代进行排除,因为我认为这个模式需要与父目录相同,我还没有想到。

1 个答案:

答案 0 :(得分:1)

您可以尝试以下脚本,它可以解决您的问题:

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