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

时间:2016-03-30 02:07:01

标签: ruby-on-rails ruby rubygems updates maintenance

Rails应用程序可能有数百个依赖项,未经检查,通常都需要定期更新。在运行bundle outdated并获得超过100个宝石的列表之后,我对于查找每个宝石,找到它的CHANGELOG以及确认更新没有&#39有点畏惧。什么打破任何东西。在没有引入所有依赖关系的情况下,update a single gem似乎没有被确认的方式。

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

当我编写自己的代码时,我一定要在提交之前检查每一行。是否应该同样警惕更新图书馆?通常在首先包含图书馆时没有进行过多的勤奋工作。但是在一个绿地项目中,通过利用其他人的代码,几乎没有什么损失可以获得。在一个成熟的项目中,对新的失败几乎没有容忍度。

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

1 个答案:

答案 0 :(得分:2)

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

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

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