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

Я начинаю Ruby on Rails, и я использую Rails 3.0.9.

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

Ответ 1

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

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

Отметьте Назначение и Обоснование Bundler, в частности, Проверка кода в разделе управления версиями.

Ответ 2

Обычно мы записываем зависимости в 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. Мои приложения для рельсов отлично работали без каких-либо проблем с этой версией.

Теперь думаю, что я пытаюсь построить с тем же 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 с помощью вашей новейшей версии приложений.

Ответ 3

Gemfile.lock

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

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

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

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