我有一个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)时,两个文件都会相应地更改名称。myFile.txt
来自foo/baz
的内容。 如果已存在具有该名称的文件,为什么Gradle不会自动覆盖存档中的文件?为什么可以在同一目录中创建两个同名文件而不覆盖一个?
答案 0 :(得分:2)
我认为这是org.apache.tools.zip.ZipOutputStream
的行为(gradle用来创建zip档案)。在这个类中,第一个zip条目标题被写入,我认为这就是zip文件看起来像包含2个文件的原因。当它写入实际文件的流时,它会覆盖以前文件的内容(因为名称相同。)