Что происходит при непосредственном изменении Gemfile.lock?

Со второго раза выполнения bundle install зависимости загружаются из Gemfile.lock, пока Gemfile не изменяется.

Но мне интересно, как происходит обнаружение изменений между этими двумя файлами.

Например, если я добавляю новую зависимость непосредственно в Gemfile.lock, не добавляя ее в Gemfile (в отличие от лучшей практики, поскольку Gemfile.lock автоматически генерируется из Gemfile), будет ли bundle install считать Gemfile как изменено?

Действительно, обрабатывает ли процесс bundle install все деревья Gemfile и Gemfile.lock для обнаружения изменений?

Если это так, даже если я добавляю зависимость напрямую к Gemfile.lock, Gemfile будет обнаружен как измененный (с другой) и будет повторно удалять Gemfile.lock(так что потеряет добавленную зависимость...)

Каков процесс bundle install с момента запуска во второй раз?

Чтобы быть более ясным, мой вопрос:

Являются ли изменения основаны только на Gemfile? Это означает, что связующий будет хранить снимок Gemfile каждого номера выполнения bundle install N и просто сравнивает его с bundle install выполнением N + 1?

Или никакие снимки не создаются в памяти связки, а bundler делает сравнение с Gemfile.lock каждый раз, чтобы определить, следует ли рассматривать Gemfile как измененный.

Ответ 1

Если вы отредактируете Gemfile.lock, то приложение Rails будет зависеть от других версий драгоценных камней... В этом случае целостность вашей системы управления версиями gem будет нарушена. Это очень-очень плохая идея для прямого редактирования файла Gemfile.lock.

Пожалуйста, будьте хорошим парнем и делайте сделки только с Gemfile

Ответ 2

Я знаю, что этот вопрос очень старый, но мне недавно пришлось иметь дело с этим, поэтому я даю свой собственный ответ. Omniauth был недавно обновлен до версии 1.3.2 для исправления проблемы безопасности. Мне было поручено обновить Omniauth до этой новой исправленной версии, однако, проверяя наш Gemfile, я понял, что у нас не было этого Gem. Поэтому я сказал хорошо, может быть, я могу просто переключить версию на Gemfile.lock с 1.3.1 до 1.3.2. Короче говоря, это сработало бы, но, оказывается, мне не пришлось так поступать. То, что я закончил, это выдать следующую команду

bundle update omniauth --patch

Это привело к тому же изменению, которое я собирался сделать вручную:

-    omniauth (1.3.1)
+    omniauth (1.3.2)

Тем не менее, если вы считаете, что вам нужно внести изменения в Gemfile.lock, возможно, есть способ сделать это изменение, не касаясь самого Gemfile.lock. Просто сделайте bundle --help, и вы, вероятно, найдете и сможете делать то, что вы пытаетесь достичь.