15

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

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

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

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

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

bundle install第二次上线以来的流程是怎样的?

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

更改仅基于 Gemfile 吗?这意味着捆绑器会保留每个执行编号 N 的 Gemfile 快照,bundle install并且仅将其与bundle install执行 N+1 进行比较?

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

4

2 回答 2

22

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

拜托,做个好人,只和 Gemfile 做交易

于 2012-06-21T10:16:07.633 回答
8

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

于 2017-10-19T15:14:26.257 回答