Ruby on rails 升级具有所有依赖项的rails版本的最佳实践是什么?

Ruby on rails 升级具有所有依赖项的rails版本的最佳实践是什么?,ruby-on-rails,ruby,git,bundler,ruby-on-rails-5,Ruby On Rails,Ruby,Git,Bundler,Ruby On Rails 5,每当rails出现重大版本冲突时,升级现有的rails应用程序(4.x、5.x等)有时是一件非常痛苦的事情,因为有很多宝石可能依赖于旧版本的rails(ActiveRecord、ActionController、ActiveModel等)。而且,这些依赖的gem有时需要花费太多的时间进行升级(要么没有维护,要么活动性较低,要么核心维护团队不可用,即使是接受拉取请求)。周围的人都遵循什么样的解决方案 人们建议的一个工作流程是,将所有依赖的gem分叉,然后根据自己的喜好进行更改,并从各自的主/主分支

每当rails出现重大版本冲突时,升级现有的rails应用程序(4.x、5.x等)有时是一件非常痛苦的事情,因为有很多宝石可能依赖于旧版本的rails(ActiveRecord、ActionController、ActiveModel等)。而且,这些依赖的gem有时需要花费太多的时间进行升级(要么没有维护,要么活动性较低,要么核心维护团队不可用,即使是接受拉取请求)。周围的人都遵循什么样的解决方案


人们建议的一个工作流程是,将所有依赖的gem分叉,然后根据自己的喜好进行更改,并从各自的主/主分支不断更新它们。我很想听听人们在工作流程中遵循什么。

我认为您应该删除/替换在Rails主要更新后不久没有兼容版本的gems

Rails 5的测试版在Rails 5发布前6个月就已经发布了。如果一个gem没有在这段时间内更新,它可能不会在以后更新,或者在其他Rails更新中也会减慢更新速度

遇到这种情况时,我看到了几种选择:

  • 重新审视您使用该gem的原因。有时,您可以使用gem来实现一些简单的方法。在您的应用程序(或您自己的gem)中重写这些方法并删除此依赖项

  • 还有其他项目可以解决同样的问题吗?有时,这些项目甚至有更好的结构或其他好处。你可以考虑切换到宝石。希望您封装了旧的gem,并且没有过多地定制该gem,因为这使得替换它变得更加困难

  • <>你可以考虑分叉这个宝石并自己解决这个问题(向原始宝石发送一个拉力请求的加分)。从短期来看,这是一个不错的解决方案。但是在下一个Ruby版本中,您很可能会遇到类似的问题。此外,当您使用一个分叉版本的gem时,您需要依靠自己。你真的想在接下来的几年里维护这个私有的gem版本吗

对于添加到堆栈中的每一个gem,您的应用程序都会面临成本和风险。观看这颗宝石的成本,它是如何变化的,是否有安全修复?以及创业板在某个时候被放弃的风险

当你遇到这样的情况时,你可以先做一些事情来减轻痛苦:

  • 避免将gem添加到应用程序中,因为您只需要gem中的几个简单助手方法

  • 用你自己的包装器封装宝石。并且对包装器接口具有良好的测试覆盖率。这使得改变基础gem变得更加容易

  • 一旦遇到问题,请随时准备移除/更换宝石。当您的应用程序中有问题需要解决时,等待外部gem维护人员可能不是一个好策略


我认为您应该删除/更换在Rails主要更新后不久没有兼容版本的gems

Rails 5的测试版在Rails 5发布前6个月就已经发布了。如果一个gem没有在这段时间内更新,它可能不会在以后更新,或者在其他Rails更新中也会减慢更新速度

遇到这种情况时,我看到了几种选择:

  • 重新审视您使用该gem的原因。有时,您可以使用gem来实现一些简单的方法。在您的应用程序(或您自己的gem)中重写这些方法并删除此依赖项

  • 还有其他项目可以解决同样的问题吗?有时,这些项目甚至有更好的结构或其他好处。你可以考虑切换到宝石。希望您封装了旧的gem,并且没有过多地定制该gem,因为这使得替换它变得更加困难

  • <>你可以考虑分叉这个宝石并自己解决这个问题(向原始宝石发送一个拉力请求的加分)。从短期来看,这是一个不错的解决方案。但是在下一个Ruby版本中,您很可能会遇到类似的问题。此外,当您使用一个分叉版本的gem时,您需要依靠自己。你真的想在接下来的几年里维护这个私有的gem版本吗

对于添加到堆栈中的每一个gem,您的应用程序都会面临成本和风险。观看这颗宝石的成本,它是如何变化的,是否有安全修复?以及创业板在某个时候被放弃的风险

当你遇到这样的情况时,你可以先做一些事情来减轻痛苦:

  • 避免将gem添加到应用程序中,因为您只需要gem中的几个简单助手方法

  • 用你自己的包装器封装宝石。并且对包装器接口具有良好的测试覆盖率。这使得改变基础gem变得更加容易

  • 一旦遇到问题,请随时准备移除/更换宝石。当您的应用程序中有问题需要解决时,等待外部gem维护人员可能不是一个好策略


+1我完全同意你所说的大部分观点,但了解脆弱的gem更新并确保依赖关系图始终是最新的确实很耗时。在少数情况下,重新编写一些东西比添加gem作为依赖项要容易得多,但在大多数情况下,如果有人已经解决了这个问题,这就像重新发明轮子一样(我太反对为了非常小的目的使用gem)。当你在做客户项目时,大部分时间你都是在紧迫的期限内完成的,而且大部分事情都不容易自己完成。让我们听听别人怎么说