Вы только что сделали bundle update, и теперь ваше приложение ведёт себя так, будто его писали на PHP после трёх бутылок виски. Всё сломано, тесты горят, а в логах — ошибки, которых вы никогда не видели. Добро пожаловать в ад зависимостей, где Gemfile.lock — ваш единственный спаситель, а Rubygems — коварный тролль, подкладывающий грабли.
🧠 Теория: как работают гемы в Ruby
Rubygems — это система управления пакетами для Ruby.
Bundler — менеджер зависимостей, который:
- Читает
Gemfile(“мне нужны эти гемы примерно в таких версиях”). - Генерирует
Gemfile.lock(“вот точные версии, которые работают вместе”). - Заставляет всех играть по правилам.
Проблема в том, что “примерно” — очень растяжимое понятие.
💣 Реальный кейс: когда ~> кусается
Допустим, у вас в Gemfile:
gem "rails", "~> 7.0.0"
Вы думаете: “Это же patch-версии, ничего не сломается!”.
А потом выходит Rails 7.0.4, где:
- Переименовали
#pluckв#pluck_all(потому что “так лучше”). - Добавили валидацию, которая считает ваш легаси-код невалидным.
ActiveRecordтеперь требует PostgreSQL 15+ (а у вас на продакшене 13).
И вот вы уже не спите ночью, вспоминая, зачем вообще занялись программированием.
🔧 Практика: как Gemfile.lock спасает (и предаёт)
Хороший Gemfile.lock:
rails (7.0.3.1)
actioncable (= 7.0.3.1)
actionmailer (= 7.0.3.1)
# ... все зависимости зафиксированы
Это гарантия, что на всех окружениях — одинаковые версии.
Плохой сценарий:
- Вы удалили
Gemfile.lock“для чистоты”. - Сделали
bundle installна продакшене. - Получили Rails 7.1.0 с breaking changes.
- Продакшен упал в 9 утра понедельника.
💀 Антипаттерны
- “Обновлять всё подряд”
bundle update --all # эквивалент игры в русскую рулетку - “Закомичу
Gemfile.lockпотом”
(Спойлер: вы забудете, и коллега сломает CI). - “У меня же указана точная версия!”
gem "pg", "1.5.3" # а его зависимости? они могут притащить ад
🛡️ Как обновляться без боли
- Локально:
bundle update gem_name --conservative - Проверяйте
CHANGELOG.md(если его нет — бегите от этого гема). - Тестируйте на staging перед деплоем.
- Используйте
bundle outdatedдля аудита: ```bash $ bundle outdated- rails (7.0.3.1 < 7.1.0) # красный флаг! ```
🧪 Тест на зрелость
— Что делает эта команда?
rm Gemfile.lock && bundle install
— Либо вы только что сломали проект, либо ваш Gemfile настолько строгий, что вы — йог зависимостей.
🧾 Вывод
Gemfile.lock— священен. Не удаляйте его, не игнорируйте в git.- Обновляйтесь осознанно.
~>— не “примерно”, а “я готов к сюрпризам”. - SemVer — это миф. Всегда читайте список изменений.