В чем разница между 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) или любой другой их зависимости были обновлены.

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