我有一个 gradle 任务来构建一个可重复的 zip,对其进行散列,然后检查散列是否相同。
task buildZip(type: Zip) {
includeEmptyDirs = false
preserveFileTimestamps = false
reproducibleFileOrder = true
from sourceSets.main.output
}
task createChecksums(type: Checksum, dependsOn: build) {
inputFiles.setFrom("${buildDir}/distributions");
appendFileNameToChecksum.set(true)
}
这按预期工作,并且哈希值是一致的。但是,当我尝试将 .jar 依赖项包含在
configurations.runtimeClassPath
下时,我注意到:
task buildZip(type: Zip) {
includeEmptyDirs = false
preserveFileTimestamps = false
reproducibleFileOrder = true
from sourceSets.main.output
into("lib") {
from configurations.runtimeClasspath
}
}
哈希值在每次干净构建时都会发生变化。为什么会发生这种情况以及如何纠正?
每次干净构建时哈希值可能会发生变化,因为
configurations.runtimeClasspath
中的文件顺序发生了变化。在将文件添加到 zip之前,您应该尝试对
configurations.runtimeClasspath
中的文件进行排序,以确保顺序一致。
task buildZip(type: Zip) {
includeEmptyDirs = false
preserveFileTimestamps = false
reproducibleFileOrder = true
from sourceSets.main.output
into("lib") {
from configurations.runtimeClasspath.files.sort()
}
}
这应该确保
configurations.runtimeClasspath
中的文件顺序一致,并且哈希值在每个干净构建中保持相同。