Как Bundler расшифровывает, какой коммит соответствует определенной версии Gem?

Я исследовал страницу Bundler и страницу RubyGem (и ТАК сообщения), но не могу понять это.

В Gemfile вы указываете Bundler, какую версию Gem использовать. Это все, что я знаю, как правда... остальное я угадываю, что происходит за кулисами.

Таким образом, похоже, что Bundler затем переходит на RubyGems.org или какой-либо другой источник, чтобы выяснить версии Gem, зависимости и расположение исходных файлов. Это мое большое предположение.

Затем, скорее всего, Bundler отправляется в хранилище кода, скорее всего, на Github, чтобы загрузить исходный код. Вот где я застрял. Если кто-то указывает версию 1.0.0, как Bundler узнает, какой коммит Git соответствует версии 1.0.0?

- Бундлер идет по тегам?

-Или Bundler идет в голову ветке, которая называется так же, как номер версии?

Или в RubyForge указан определенный коммит?

Или снимок исходного кода доступен прямо через RubyForge?

Мне интересно, потому что, если я укажу Gem на 1.0.0 и сделаю установку пакета. Bundle принимает коммит в начале ветки 1.0.0 (если это так, как это делает Bundler), то если в этой ветке есть последующие коммиты (но версия остается прежней), значит ли это, что у меня будет другая версия что Gem, чем кто-то, кто связывает после меня (после последующих коммитов на ветке)?

Было бы разумно, чтобы упаковщик разрешал версию для конкретного коммита, но как именно компоновщик выбирает коммит? Потому что версия 1.0.0 может существовать между несколькими коммитами.

Спасибо за ваше время!

1 ответ

Решение

Когда gem загружается на RubyGems.org, код упаковывается с gemspec в файл.gem (который по сути является архивом, похожим на файл.zip или.tar.gz). Затем RubyGems.org распаковывает gemspec и читает его, чтобы получить информацию о версии и т. Д.

Когда вы указываете версию Gem в Bundler, он проверяет RubyGems.org, чтобы узнать, доступна ли эта версия. Если это так, он загружает файл.gem непосредственно с RubyGems.org и распаковывает его. Весь код находится прямо в файле.gem, поэтому нет необходимости скачивать его с GitHub. Если вы укажете версию, которой нет на RubyGems.org, вы получите ошибку.

Единственный раз, когда Bundler загружает что-либо из GitHub, это если вы укажете git или же github вместо версии. В этом случае он загрузит либо последнюю фиксацию в основной ветке (или ту ветку, которая указана в вашем Gemfile), либо, если Gemfile.lock существует, какая фиксация будет указана в Gemfile.lock.

Другие вопросы по тегам