如何安全地更新 Rails 应用程序中的所有 gem

Posted

技术标签:

【中文标题】如何安全地更新 Rails 应用程序中的所有 gem【英文标题】:How to safely update all gems in a Rails application 【发布时间】:2016-03-30 02:07:00 【问题描述】:

Rails 应用程序可能有数百个依赖项,如果不加以检查,通常都需要定期更新。在运行bundle outdated 并获得 100 多个已过期的 gem 的列表后,我对查找每一个、找到其 CHANGELOG 并确认更新不会破坏任何东西的前景感到有点害怕。在不引入其所有依赖项的情况下,似乎甚至没有确定的方法可以到达 update a single gem。

我发现 this project 在通过自动化测试后应该在单独的提交中更新每个 gem。这将有助于简化流程,但它不会告诉您哪些 gem 版本升级包括 DSL 更改(例如this one)。有时我盲目地更新次要或补丁版本而不检查,希望作者遵循SEMVER-like 版本控制约定。其他时候没有文档(没有 History 或 CHANGELOG 文件)。

当我编写自己的代码时,我一定会在提交之前检查每一行。同样的警惕性也适用于更新图书馆吗?通常在首先包含图书馆时没有进行太多的努力。但是在一个新建项目中,利用其他人的代码几乎没有什么可失去的,而且可以得到很多。在一个成熟的项目中,几乎不能容忍新的失败。

是否有任何工具或流程可以一次提取一个更新、以类似差异的方式查看更改、查看 CHANGELOG(如果有)以及运行测试套件?

【问题讨论】:

【参考方案1】:

我的策略是在可能的情况下一次只更新几个宝石。显然,依赖树会使这变得困难,但我已经被盲目运行bundle update 烧毁了几次,特别是在有 100 多个 gem 的大型项目中,如果可能的话,这会避免它。更新较小的 gems 组还提供了额外的好处,因为任何副作用都更容易隔离和解决。

另外,我尝试养成对 Gemfile/Gemfile.lock 的任何更改使用专用 git 提交的习惯。因此,任何和所有依赖项更新都有一个提交,其中仅包含对这两个文件的更改。这使得使用git bisect 进行调试变得更加容易,并且如果需要,更改很容易恢复。它还有助于解决依赖关系的不可避免的试错过程。我发现这种策略也适用于迁移(尽管迁移比依赖项 IMO 更棘手)。

当然,每隔一段时间就会对 Rails、Sidekiq、ActiveAdmin、RSpec 等主要依赖项进行更新。人。出现了,但这种情况相对较少,并且保持“更薄”的依赖关系使得这种药丸更容易下咽。

【讨论】:

以上是关于如何安全地更新 Rails 应用程序中的所有 gem的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Symfony 2 中进入维护模式以安全地更新生产应用程序?

如何从heroku中的rails应用程序获取完整的production.log?

如何将 Rails 6 中的 JqTree 与 webpacker 集成,树不是函数

如何从rails中的api更新用户模型?

在 Rails 应用程序中安全地提供数据库密码

如何在生产模式下修复 Rails 的路由错误?