直接修改Gemfile.lock会发生什么?

时间:2012-06-21 09:01:12

标签: ruby gem

自第bundle install次执行以来,只要未更改Gemfile,就会从Gemfile.lock加载依赖项。

但我想知道如何检测这两个文件之间的变化。

例如,如果我将新的依赖项直接添加到Gemfile.lock而不将其添加到Gemfile中(与Gemfile自动生成Gemfile.lock的最佳做法相反),bundle install认为Gemfile已更改?

的确,bundle install进程是否会比较整个Gemfile和Gemfile.lock树以检测更改?

如果是,即使我直接向Gemfile.lock添加依赖项,Gemfile也会被检测为已更改(因为不同)并且会重新擦除Gemfile.lock(因此会丢失添加的依赖项...)< / p>

第二次推出以来bundle install的过程是什么?

更清楚的是,我的问题是:

更改是否仅基于Gemfile?这意味着bundler会保留每个bundle install执行号N的Gemfile快照,只是将它与bundle install执行N + 1进行比较?

或者在bundler内存中没有创建快照,bundler每次都会与Gemfile.lock进行比较,以检测是否必须将Gemfile视为已更改。

2 个答案:

答案 0 :(得分:19)

如果您编辑Gemfile.lock,那么Rails应用程序将依赖于其他版本的gem ...在这种情况下,gem-versioning系统的完整性将被破坏。直接编辑Gemfile.lock文件是一个非常糟糕的主意。

请成为一个好人,只与Gemfile达成交易

答案 1 :(得分:5)

我知道这个问题很老,但我最近不得不处理这个问题,所以我给出了自己的答案。 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,您就可以找到并选择做您想要达到的目标。