Gradle 重复构建的校验和相同
Gradle same checksum for repeated build
我正在使用 gradle 构建一个 Java 项目,并希望发布校验和文件以及我构建的工件。问题是重复构建会生成不同的校验和,而无需更改任何代码。花了一些时间追查问题后,原因很明显:
- 生成的 class 文件获得创建时间的 creation/modification 时间戳(伟大的发现!!)
- 此修改日期作为元数据添加到生成的 jar/zip 档案中,导致校验和差异
也就是说,实际上不可能在稍后的某个时间点重新构建将输出相同文件的特定版本。
我认为通过将工件创建后的 modification/creation 日期更改为某个默认值来 "fix" 非常容易。但这会导致档案中出现某种奇怪的元数据信息——类似 1970-01-01T00:00:00Z
的内容非常明显,但乍一看仍然令人困惑。
是否有任何其他方法可以在创建档案时完全省略时间戳元数据。或者在创建档案后删除它?
或者是否有任何其他方法可以使重复构建生成相同 工件?
我真的想知道这种情况的最佳做法是什么?!
您可以使用 Gradle 生成可复制的存档,而 IIUC 正是您想要的。此功能记录在 Gradle 的 userguide.
中
您需要像这样配置您的项目:
tasks.withType(AbstractArchiveTask) {
preserveFileTimestamps = false
reproducibleFileOrder = true
}
看起来甚至还有一个插件可以为您进行配置,尽管它似乎不再处于活动状态:https://github.com/Johni0702/gradle-reproducible-builds-plugin
我正在使用 gradle 构建一个 Java 项目,并希望发布校验和文件以及我构建的工件。问题是重复构建会生成不同的校验和,而无需更改任何代码。花了一些时间追查问题后,原因很明显:
- 生成的 class 文件获得创建时间的 creation/modification 时间戳(伟大的发现!!)
- 此修改日期作为元数据添加到生成的 jar/zip 档案中,导致校验和差异
也就是说,实际上不可能在稍后的某个时间点重新构建将输出相同文件的特定版本。
我认为通过将工件创建后的 modification/creation 日期更改为某个默认值来 "fix" 非常容易。但这会导致档案中出现某种奇怪的元数据信息——类似 1970-01-01T00:00:00Z
的内容非常明显,但乍一看仍然令人困惑。
是否有任何其他方法可以在创建档案时完全省略时间戳元数据。或者在创建档案后删除它?
或者是否有任何其他方法可以使重复构建生成相同 工件?
我真的想知道这种情况的最佳做法是什么?!
您可以使用 Gradle 生成可复制的存档,而 IIUC 正是您想要的。此功能记录在 Gradle 的 userguide.
中您需要像这样配置您的项目:
tasks.withType(AbstractArchiveTask) {
preserveFileTimestamps = false
reproducibleFileOrder = true
}
看起来甚至还有一个插件可以为您进行配置,尽管它似乎不再处于活动状态:https://github.com/Johni0702/gradle-reproducible-builds-plugin