Gradle允许zip存档中具有相同名称的两个文件

时间:2018-03-14 17:08:32

标签: gradle

我有一个gradle任务buildZip,它将两个目录的内容放在一个目录中。两个目录都包含一个名称相同的文件myFile.txt,但它们的内容不同。这是原始目录结构:

foo/
├── bar/
│   └── myFile.txt    # 10kB
└── baz/
    └── myFile.txt    # 20kB

Gradle任务将两个文件放入存档的根目录:

task buildZip(type: Zip) {
    archiveName 'myArchive.zip'
    includeEmptyDirs false

    from('foo/bar') {
      include 'myFile.txt'
    }
    from('foo/baz') {
      include 'myFile.txt'
    }
}

我认为第二个from...include会覆盖第一个myFile.txt。相反,这是生成的存档的结构:

myArchive.zip
├── myFile.txt    # 10kB
└── myFile.txt    # 20kB

这会导致一些奇怪的行为:

  • 当我打开存档并将myFile.txt的名称更改为myFile.txt.bkup(通过WinZip)时,两个文件都会相应地更改名称。
  • 两个文件都报告了它们的原始大小(10kB和20kB),但它们的内容是相同的 - 特别是后者myFile.txt来自foo/baz的内容。

如果已存在具有该名称的文件,为什么Gradle不会自动覆盖存档中的文件?为什么可以在同一目录中创建两个同名文件而不覆盖一个?

1 个答案:

答案 0 :(得分:2)

我认为这是org.apache.tools.zip.ZipOutputStream的行为(gradle用来创建zip档案)。在这个类中,第一个zip条目标题被写入,我认为这就是zip文件看起来像包含2个文件的原因。当它写入实际文件的流时,它会覆盖以前文件的内容(因为名称相同。)

Gradle Zip

ZipOutputStream