Если вы разрабатываете с помощью Ruby on Rails, особенно если вы новичок в нем, в какой-то момент у вас могут возникнуть вопросы о версиях гемов. Иногда может возникнуть путаница, какую версию гема выбрать, указывать номер версии явно или нет и как это сделать. Чтобы немного прояснить ситуацию, мы собираемся охватить некоторые основы, касающиеся различных способов указания версии гема, разницы между Gemfile и Gemfile.lock и того, как пакет устанавливается команда работает для обновления драгоценных камней в вашем приложении.

Версии драгоценных камней

Когда вы создаете приложение Ruby on Rails, вы, вероятно, используете Bundler для управления своими драгоценными камнями в Gemfile. Если вы когда-либо искали в Интернете помощь с установкой или версиями гемов, вы могли заметить, что иногда драгоценные камни просто добавляются в Gemfile путем ввода gem и имени драгоценного камня в скобках, а иногда и там - это версии с различными символами (например, «› = 2.3.0 »), как показано ниже.

Итак, когда вам следует просто указать имя Gemfile, а когда лучше всего указать версию? Что ж, обычно точная версия явно используется, когда вы знаете (или читаете), что конкретная версия уже была протестирована и работает с функциями или спецификациями приложения, которые вы используете. Например, если вы отправляете свое приложение на платформу облачных приложений, могут возникнуть проблемы с правильной работой определенных версий гемов на этой платформе. Если вы сами столкнулись с проблемами при использовании определенного драгоценного камня или знаете, что есть у других разработчиков, вы можете узнать, какие версии этого драгоценного камня считаются стабильными для ваших спецификаций. Добавляя точную версию вашего драгоценного камня (например, «= 2.1.6») в Gemfile, вы гарантируете, что будет использоваться только эта конкретная стабильная версия.

Точно так же вы можете обнаружить, что только более новые (или старые) версии гема работают со спецификациями вашего приложения. Например, выходит новая версия гема, и изменения позволяют этому гему теперь работать в вашем приложении, но вы знаете, что предыдущие версии не работали. Или наоборот, новое обновление драгоценного камня может не поддерживаться на вашей облачной платформе, например, или может потребовать более широких изменений в вашем приложении, которые вы не планируете вносить. В этих случаях может быть полезно явно установить версию гема, большую (или меньшую), чем или равную (‘› = ’,‘ ‹=’) конкретной версии gem.

Иногда вы также можете увидеть тильду и знак «больше» (‘~› ’), которые немного похожи на стрелку (на фото ниже). Это означает, что может увеличиваться только последнее целое число в номере версии.

Итак, в этом примере гем bootstrap-sass может увеличиваться, если он все еще является версией 3.3.5.xx. Другими словами, он может обновиться до 3.3.5.2 или полностью до 3.3.5.9, но никогда не будет до 3.3.6.0.

Gemfile против Gemfile.lock

Чтобы лучше понять, когда использовать указанные выше параметры для указания версии, нам нужно понять, как работает Bundler. После добавления ваших драгоценных камней в Gemfile (или внесения изменений в Gemfile) вам необходимо выполнить команду bundle install.

Это будет использовать текущую сохраненную версию Gemfile для установки (или переустановки) ваших драгоценных камней, в зависимости от того, указали ли вы версии и параметры гемов. Если вы не указали точную версию или параметры для допустимых версий (например, ‘‹ ’,‘ ›=’), Bundler обычно попытается установить последнюю версию. Обратите внимание, что это не всегда так, и если вы не указали точную версию, вы можете получить или не получить самую последнюю версию драгоценного камня.

Когда вы запускаете bundle install, Bundler извлекает все удаленные источники, разрешает зависимости (о которых мы не будем вдаваться) и либо создаст, либо обновит файл Gemfile.lock. В этом файле отображаются все версии гемов и зависимости, которые были установлены и обновлены после последнего запуска установки пакета. Другими словами, файл Gemfile.lock - это то место, где вы можете проверить версии гемов, установленных для вашего приложения, если в Gemfile не будут внесены изменения и установка пакета не будет запущена снова.

Следует иметь в виду, что если вы добавляете или изменяете какой-либо гем в Gemfile, запуск bundle install для реализации этого конкретного изменения может непреднамеренно обновить / изменить версию для любого из других драгоценных камней в вашем Gemfile, где точная версия явно не указана (например, если новая версия была выпущена после последнего запуска установки пакета). Таким образом, рекомендуется тестировать функциональность вашего приложения каждый раз при запуске установки пакета, чтобы убедиться, что любые непреднамеренные обновления гемов не повлияли отрицательно на ваше приложение.

✍️ Подпишитесь, чтобы получать мои новейшие статьи, опубликованные в таких публикациях, как The Startup & Towards Data Science ➡️