【问题标题】:What happens when modifying Gemfile.lock directly?直接修改 Gemfile.lock 会发生什么?
【发布时间】:2017-10-19 23:14:26
【问题描述】:

自从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 的更改?这意味着 bundler 会保留每个 bundle install 执行次数 N 的 Gemfile 快照,并且仅将其与 bundle install 执行次数 N+1 进行比较?

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

【问题讨论】:

  • 只需删除 Gemlock 文件,将所需的 gem 放入 gem 文件并运行 bundle install。而已。我认为多考虑 gemlock 文件不是一个好主意。 ;)
  • @uDaY 我同意你的看法,但我对 bundle install 的底层过程很好奇 :)
  • 你读过thisthis吗?

标签: ruby gem


【解决方案1】:

如果您编辑 Gemfile.lock,那么 Rails 应用程序将依赖于其他版本的 gems...在这种情况下,您的 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,您可能会找到并选择执行您想要实现的目标。

    【讨论】:

    • 谢谢,这有帮助,正在寻找补丁版本!
    • 我很高兴@Andrei-NiculaePetre
    猜你喜欢
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    相关资源
    最近更新 更多