#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