Почему при многократном создании одного и того же gemspec создаются разные двоичные файлы драгоценных камней?

#ruby #rubygems

Вопрос:

При создании gem через gem build GEMSPEC созданный файл .gem каждый раз отличается , несмотря на то, что в коде или спецификации gemspec ничего не меняется. Для демонстрации я буду использовать репозиторий hola, на который есть ссылка на странице «Создай свой собственный драгоценный камень» на RubyGems.org:

 $ git clone https://github.com/qrush/hola
$ cd hola
$ gem build hola.gemspec -o 1.gem
$ gem build hola.gemspec -o 2.gem
 

Используя diff и sha512sum вы можете ясно видеть, что сгенерированные двоичные файлы не совпадают:

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

Почему это происходит? Есть ли какой-нибудь способ вывести gem build один и тот же двоичный файл? Если нет, есть ли способ проверить, что содержимое встроенного драгоценного камня такое же, как и у другого?

Ответ №1:

Файл gemfile-это в основном архив tar, и tar сохраняет такие вещи, как временные метки изменения файлов, которые будут меняться. Смотрите здесь более подробное исследование этого явления.

Комментарии:

1. Спасибо! Это отвечает на вопрос «почему» и помогло мне найти лучший способ получить правильную контрольную сумму для содержимого: tar -xzOf 1.gem data.tar.gz | tar -xO | sha512sum