В чем разница между Gemfile и Gemfile.lock в Ruby on Rails - PullRequest
112 голосов
/ 03 августа 2011

Я новичок в Ruby on Rails и использую Rails 3.0.9.

В чем разница между Gemfile и Gemfile.lock в Rails?

Ответы [ 3 ]

147 голосов
/ 03 августа 2011

Gemfile - это то, где вы указываете, какие гемы вы хотите использовать, и позволяет указать, какие версии.

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

Проверьте Назначение и обоснование Bundler , в частностиПроверка вашего кода в разделе контроля версий.

144 голосов
/ 09 июня 2012

Обычно мы пишем зависимости в Gemfile как:

gem "nokogiri", "~> 1.4.4"
gem 'bcrypt-ruby', '~> 3.0.0'
gem 'uglifier', '>= 1.2.3'
..

Здесь вы в основном говорите: « Я хочу нокогири, если он больше версии 1.4.4 » и т. Д. Теперь предположим, что я настроил Gemfile 8 месяцев назад и я успешно настроил приложение с этим требованием. 8 месяцев назад версия nokogiri была 1.4.4 . Мои приложения rails работали без проблем с этой версией.

Теперь подумайте, что я пытаюсь построить с тем же Gemfile. Но если мы посмотрим на версии nokogiri , то увидим, что текущая стабильная версия изменилась на 1.4.9 . Это означает, что если мы попытаемся собрать, то bundler установит версию 1.4.9 nokogiri (предположим, у нас нет Gemfile.lock).

Что это значит?

Как видите, если у вас нет Gemfile.lock и выполните команду:

bundle install

затем используемые в настоящее время драгоценные камни могут отличаться в любое время . Ваше приложение использовало версию 1.4.4 , и оно работает 8 месяцев назад без каких-либо проблем, но если вы попытаетесь его построить сейчас , вы получите версию 1.4.9 . Может быть, он не работает с последней версией nokogiri, потрясающая функция, которую вы использовали с 1.4.4 , больше недоступна и т. Д.

Для предотвращения подобных проблем используется Gemfile.lock. В Gemfile.lock записаны только точные версии , и, таким образом, будут установлены только они. Это означает, что если вы распространяете свое приложение с Gemfile.lock, на каждой машине будут установлены одинаковые гемы, и самое важное , они все получат одинаковую версию . Это даст вам стабильный и общий стек развертывания.

Как создается Gemfile.lock?

Создается автоматически с первым:

bundle install

команда. После этого каждый раз, когда вы запускаете bundle install, bundle сначала ищет Gemfile.lock и устанавливает указанные там гемы. Это привычка распространять этот файл среди ваших проектов, чтобы обеспечить стабильность и стабильность.

Как обновить Gemfile.lock?

Если вы довольны последней версией своих приложений, вы можете обновить Gemfile.lock. Просто отразите ваши изменения в Gemfile. Это означает изменение зависимостей на новые точные версии в Gemfile. После этого запустите:

bundle install

Это обновит вас Gemfile.lock с вашей последней версией приложений.

3 голосов
/ 07 ноября 2013

Gemfile.lock

Когда вы запускаете пакетную установку, Bundler сохранит полные имена и версии всех используемых вами драгоценных камней (включая зависимости драгоценных камней, указанных в Gemfile (5)) в файл.называется Gemfile.lock.

Bundler использует этот файл во всех последующих вызовах для установки пакета, что гарантирует, что вы всегда используете один и тот же точный код, даже когда ваше приложение перемещается по компьютерам.

Из-заКак работает разрешение зависимостей, даже небольшое, на первый взгляд, изменение (например, обновление точечного выпуска зависимости драгоценного камня в вашем Gemfile (5)) может привести к радикально различным драгоценным камням, необходимым для удовлетворения всех зависимостей.

В результате вы ДОЛЖНЫ проверить ваш Gemfile.lock в системе контроля версий.Если вы этого не сделаете, каждая машина, которая проверяет ваш репозиторий (включая ваш производственный сервер), снова разрешит все зависимости, что приведет к использованию разных версий стороннего кода, если какой-либо из гемов в Gemfile (5) или любой другойих зависимости были обновлены.

...