自第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视为已更改。
答案 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
,您就可以找到并选择做您想要达到的目标。