2010-11-11 3 views
430

Я как бы новичок в комплекте и файлы, которые он создает. У меня есть копия git-репо из GitHub, которой много людей, поэтому я был удивлен, обнаружив, что этот сборщик создал файл, который не существовал в репо и не был в списке .gitignore.Должен ли Gemfile.lock быть включен в .gitignore?

Поскольку я его разветвил, я знаю, что добавление его к репо не будет ломать ничего для основного репо, но если я сделаю запрос на тяну, это вызовет проблему?

Должно ли Gemfile.lock быть включенным в репозиторий?

+0

http://www.stackoverflow.com/questions/14034561/should-gemfile-lock-be-committed-to-source-control-on-windows – ripper234

+2

Если вы нашли здесь, потому что у вас есть ящики Linux и Windows, которые используют одно и то же репо, см. ответ Джо Янга. Во время моего написания это занимает третье место. Также см. Http://stackoverflow.com/questions/14034561/should-gemfile-lock-be-committed-to-source-control-on-windows –

ответ

476

Предполагая, что вы не пишете rubygem, Gemfile.lock должен находиться в вашем репозитории. Он используется как моментальный снимок всех необходимых драгоценных камней и их зависимостей. Таким образом, поставщику не нужно пересчитывать все зависимости от драгоценных камней при каждом развертывании и т. Д.

Из комментария cowboycoded.

Если вы работаете над драгоценным камнем, то DO НЕ проверяйте свой Gemfile.lock.

Вот хороший article, объясняющий, что такое файл блокировки.

+78

Зависит от того, над чем вы работаете. Если вы работаете над драгоценным камнем, НЕ ЗАПУСТИТЕ ваш Gemfile.lock. Если вы работаете над Rails-приложением, тогда DO проверьте свой Gemfile.lock. Подробнее здесь - http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/ – johnmcaliley

+0

Очень хорошая точка. – rwilliams

+0

Thx для полезной статьи. – a5his

11

Соглашаясь с г-даба, держать его под контролем источника, но для меня, реальная выгода заключается в следующем:

сотрудничество в одинаковых условиях (без учета windohs и Linux/Mac вещи). Перед тем, как Gemfile.lock, следующий чувак, чтобы установить проект, может видеть всевозможные запутанные ошибки, обвиняя себя, но он был просто счастливым парнем, который получил следующую версию супер драгоценного камня, нарушая существующие зависимости.

Хуже того, это произошло на серверах, получив непроверенную версию, если не быть дисциплинированным и установить точную версию. Gemfile.lock делает это явным, и он явно укажет вам, что ваши версии разные.

Примечание: помните, группа вещей, как: разработка и: тест

46

Реальная проблема возникает, когда вы работаете над приложением с открытым исходным кодом Rails, который должен иметь настраиваемый адаптер базы данных. Я занимаюсь разработкой ветки Rails 3 Fat Free CRM. Мои предпочтения - postgres, но мы хотим, чтобы база данных по умолчанию была mysql2.

В этом случае необходимо пометить Gemfile.lock с набором по умолчанию драгоценных камней, но мне нужно проигнорировать изменения, которые я сделал с ним на моей машине. Для достижения этой цели, я бегу:

git update-index --assume-unchanged Gemfile.lock 

и обратное:

git update-index --no-assume-unchanged Gemfile.lock 

Это также полезно включить что-то вроде следующего кода в вашем Gemfile. Это загружает соответствующий жёсткий адаптер базы данных на основе вашей базы данных.yml.

# Loads the database adapter gem based on config/database.yml (Default: mysql2) 
# ----------------------------------------------------------------------------- 
db_gems = {"mysql2"  => ["mysql2", ">= 0.2.6"], 
      "postgresql" => ["pg",  ">= 0.9.0"], 
      "sqlite3" => ["sqlite3"]} 
adapter = if File.exists?(db_config = File.join(File.dirname(__FILE__),"config","database.yml")) 
    db = YAML.load_file(db_config) 
    # Fetch the first configured adapter from config/database.yml 
    (db["production"] || db["development"] || db["test"])["adapter"] 
else 
    "mysql2" 
end 
gem *db_gems[adapter] 
# ----------------------------------------------------------------------------- 

Я не могу сказать, если это установленная передовая практика или нет, но она работает хорошо для меня.

+1

+1 спасибо за этот ввод. – DJTripleThreat

+2

Очень полезная информация ... не знаю, почему у вас есть только 3 балла, а менее полезный ответ - 50 очков. О, да, посмотри на даты. (Один из больших неудач SO - непропорциональные выгоды, которые возникают, чтобы ответить вскоре после того, как задан вопрос.) – iconoclast

+1

@iconoclast: Я очень рад, что вы опубликовали, что вы сделали. Я думаю, что многие люди, которые приходят на этот пост, включая меня, «ослеплены» вопросом названия. Теперь я понимаю, что мой ответ отвечает только на конкретный случай использования и не обязательно на правильный ответ на этот вопрос. Я буду работать над его обновлением в ближайшем будущем. Тем не менее, ОП не должен был отмечать мой ответ как правильный, если он не удовлетворил его/ее потребности. – rwilliams

31

Мои товарищи по работе и у меня разные Gemfile.lock, потому что мы используем разные платформы, окна и mac, а наш сервер - Linux.

Мы решили удалить Gemfile.lock в репо и создать Gemfile.lock.server в git repo, также как и database.yml. Затем, прежде чем развернуть его на сервере, мы копируем Gemfile.lock.server к Gemfile.lock на сервере с помощью колпачка Deploy крючка

+5

У меня есть приложение, которое я разрабатываю в OSX, а затем нужно развернуть на сервере Windows. Отслеживание Gemfile.lock с git оказалось плохой идеей, поэтому оно пошло в мой файл .gitignore. Множество драгоценных камней требуют разных версий для разных сред. В идеале вам следует избегать того, чтобы когда-либо быть в этой ситуации, но у меня не было выбора (черт побери!). – brad

9

Документов Bundler ответить на этот вопрос, а также:

ORIGINAL: http://gembundler.com/v1.3/rationale.html

EDIT: http://web.archive.org/web/20160309170442/http://bundler.io/v1.3/rationale.html

Смотрите раздел под названием «Проверка коды в Управление версий»:

После разработки приложения для КНА ile, проверьте приложение вместе с моментальным снимком Gemfile и Gemfile.lock. Теперь, , в вашем репозитории есть запись точных версий всех драгоценных камней , которые вы использовали в последний раз, когда вы точно знаете, что приложение работало. Имейте в виду, что, хотя ваш Gemfile содержит только три драгоценных камня (с разной степенью строгости версии), ваше приложение зависит от десятков драгоценных камней от , как только вы принимаете во внимание все неявные требования драгоценных камней, от которых вы зависите.

Это важно: Gemfile.lock делает ваше приложение единственным пакетом как вашего собственного кода, так и стороннего кода, который он провел последним , когда вы точно знаете, что все работает. Указание точных версий стороннего кода, в котором вы зависеть от вашего Gemfile, будет не предоставлять такую ​​же гарантию, потому что драгоценные камни обычно объявляют диапазон версий для их зависимостей.

В следующий раз, когда вы запускаете установку пакета на том же компьютере, поставщик будет видеть, что он уже имеет все необходимые зависимости и пропустил процесс установки .

Не проверяйте каталог .bundle или любые его файлы внутри него. Эти файлы специфичны для каждой конкретной машины и используются для . Сохраняйте параметры установки между прогонами пакета установки .

Если у вас есть пакет комплекта, драгоценные камни (хотя и не git gems) , необходимые вашему комплекту, будут загружены в вендор/кэш. Bundler может работать без подключения к Интернету (или серверу RubyGems), если все необходимые вам камни присутствуют в этой папке и отмечены как ваш источник управления. Это необязательный шаг, а не рекомендуется, из-за увеличения размера вашего исходного хранилища.

+0

Хорошее объяснение, спасибо. – akostadinov

3

Немного поздно на вечеринку, но ответы по-прежнему занимают у меня время, а иностранные читают, чтобы понять эту проблему. Поэтому я хочу обобщить то, что я узнал о Gemfile.lock.

Когда вы создаете приложение Rails, вы используете определенные версии драгоценных камней на своей локальной машине. Если вы хотите избежать ошибок в режиме производства и в других ветвях, вы должны использовать этот один файл Gemfile.lock всюду и сообщить поставщику bundle для восстановления драгоценных камней каждый раз, когда он изменяется.

Если Gemfile.lock изменилось на производственной машине и Git не позволяет git pull, вы должны написать git reset --hard, чтобы избежать этого изменения файла и записи git pull снова.

+0

Если файл изменяется автоматически, например. по процессу сборки, это явный признак того, что его нельзя добавлять в управление версиями. –

3

Нет Gemfile.lock означает:

  • новые вкладчики не могут выполнять тесты, потому что странные вещи терпят неудачу, так что они не будут способствовать или получить провала попытки ... плохой PR, первый опыт.
  • вы не можете вернуться к Топор год старый проект и исправить ошибку без необходимости обновлять/переписать проект, если вы потеряли свой местный Gemfile.lock

-> Всегда проверяйте в Gemfile.lock, сделать Трэвис удалить если вы хотите быть более тщательным https://grosser.it/2015/08/14/check-in-your-gemfile-lock/

Смежные вопросы