为什么多次构建相同的 gemspec 会创建不同的 gem 二进制文件?

Why does building the same gemspec multiple times create different gem binaries?

通过 gem build GEMSPEC 构建 gem 时,创建的 .gem 文件每次都不同,尽管代码或 gemspec 没有任何变化。为了演示,我将使用在 RubyGems.org:

Make your own gem 页面中链接的 hola 存储库
$ git clone https://github.com/qrush/hola
$ cd hola
$ gem build hola.gemspec -o 1.gem
$ gem build hola.gemspec -o 2.gem

使用diffsha512sum可以清楚的看到生成的二进制文件是不一样的:

$ diff 1.gem 2.gem
Binary files 1.gem and 2.gem differ
$ sha512sum ./*.gem
288a329f69febb51288bea381275688172e2d13fb13ee0868e910e7e0efdaf1e330b158502ce01378eff637f8d18aa8d8c4f6d9c2922deb92a4018ddacdc0624  ./1.gem
cb35b0e1eabfd3d6b0bff698a7d79caf2bcb6e71781134702857fde8619bc09a451284984ac0394a27c7266e5313374d98c2a1502d2ad89a97de1ac10844978c  ./2.gem

为什么会这样?有没有办法让 gem build 输出相同的二进制文件?如果不是,有没有办法验证构建的内容 gem 是否与另一个相同?

gemfile 基本上是一个 tar 存档,并且 tar 保留诸如文件修改时间戳之类的内容,这些内容会发生变化。有关此现象的更彻底调查,请参阅 here