В чем разница между Gemfile и Gemfile.lock в Ruby on Rails
Я новичок в Ruby on Rails и использую Rails 3.0.9.
В чем разница между Gemfile
а также Gemfile.lock
в рельсах?
3 ответа
Gemfile
где вы указываете, какие драгоценные камни вы хотите использовать, и позволяет вам указать, какие версии.
Gemfile.lock
Файл, где Bundler записывает точные версии, которые были установлены. Таким образом, когда та же библиотека / проект загружается на другой компьютер, выполняется bundle install
будет смотреть на Gemfile.lock
и установить точно такие же версии, а не просто с помощью Gemfile
и установка самых последних версий. (Запуск разных версий на разных машинах может привести к сбою тестов и т. Д.) Вам никогда не придется напрямую редактировать файл блокировки.
Ознакомьтесь с назначением и обоснованием Bundler, в частности с разделом Проверка кода в управлении версиями.
Обычно мы пишем зависимости в Gemfile как:
gem "nokogiri", "~> 1.4.4"
gem 'bcrypt-ruby', '~> 3.0.0'
gem 'uglifier', '>= 1.2.3'
..
Здесь вы в основном говорите: "Я хочу nokogiri, пока он больше, чем версия 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
, расслоение будет сначала искать вверх Gemfile.lock
и установите драгоценные камни, указанные там. Это привычка распространять этот файл среди ваших проектов, чтобы обеспечить стабильность и стабильность.
Как обновить Gemfile.lock?
Если вы довольны последней версией своих приложений, вы можете обновить Gemfile.lock
, Просто отразите ваши изменения в Gemfile
, Это означает изменение зависимостей на новые точные версии в Gemfile
, После этого запустите:
bundle install
Это обновит вас Gemfile.lock
с вашей последней версией приложений.
Gemfile.lock
Когда вы запустите пакетную установку, Bundler сохранит полные имена и версии всех используемых вами драгоценных камней (включая зависимости драгоценных камней, указанных в Gemfile(5)) в файл с именем Gemfile.lock.
Bundler использует этот файл во всех последующих вызовах для установки пакета, что гарантирует, что вы всегда будете использовать один и тот же точный код, даже когда ваше приложение перемещается между компьютерами.
Из-за того, как работает разрешение зависимостей, даже небольшое, казалось бы, изменение (например, обновление точечного выпуска зависимости драгоценного камня в вашем Gemfile(5)) может привести к радикально различным драгоценным камням, необходимым для удовлетворения всех зависимостей.
В результате вы ДОЛЖНЫ проверить ваш Gemfile.lock в системе контроля версий. Если вы этого не сделаете, каждый компьютер, который проверяет ваш репозиторий (включая ваш производственный сервер), снова разрешит все зависимости, что приведет к использованию различных версий стороннего кода, если какой-либо из гемов в Gemfile (5) или любой другой их зависимости были обновлены.