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