是否在Gemfile中强制指定Gem版本用于rails应用程序

时间:2011-09-07 08:24:34

标签: ruby-on-rails rubygems bundler

我想知道我应该为每个添加到Gemfile的gem指定gem版本。早些时候我的项目很少,我没有为所有宝石指定任何版本,捆绑商负责处理它,这也很好。

但最近我开始研究过去6个月正在开发的项目。在该项目中,许多gem版本仅在Gemfile中指定,并且Gemfile.lock被忽略。最终解决版本冲突和升级少数宝石引起了很多麻烦。

还要知道从应用程序版本控制中删除Gemfile.lock是不好的做法 - yehuda的好文章 - http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/

所以,我的问题是我应该为我在Gemfile中指定的每个gem指定版本,还是只指定name和bundler将处理版本?处理这个问题的最佳做法是什么?

更新 -

更新此问题以正确指定问题,因为Gemfile可以解决许多问题:)

问题1 - 每个开发者都应该拥有相同版本的宝石。 实际上将Gemfile.lock添加到版本控制中解决了这个问题。开发人员只需要注意他们运行'bundle install'/'bundle'而不是'bundle update',因为这样也会更新版本。

Prob 2 - 某些gems版本,如果更改,则会制动应用程序代码。 实际上,对于omniauth,存在这种类型的问题,因为API从一个版本更改为另一个版本。是的,为了保持应用程序的正常运行,需要为这个宝石指定版本。

我的问题。 - 因此,在我的gemfile中,由于严格指定了A和B的版本,并且因为它们都依赖于Z的不同版本,这是依赖性,我甚至无法运行bundle install或bundle update。唯一的解决方案是删除版本并让Bundler接听电话。这就是我有问题的原因 - Gemfile.version_specification_mandatory? #=>真/假

4 个答案:

答案 0 :(得分:6)

我认为最好在Gemfile中指定gem版本。在极少数情况下,可能需要指定版本 - 例如,当较新的版本破坏您的应用程序时。但是为所有宝石指定版本通常是矫枉过正。 Gemfile.lock文件(您不进行编辑,但检查版本控制)将使您的应用程序中使用较新版本的gem,直到您明确升级到它们。

答案 1 :(得分:2)

如果您将gem用于仅在特定版本中可用的内容,则需要指定版本。

如果未指定版本,Bundler将安装最新版本或使用系统上的可用版本。这适用于开发人员,因为最新版本具有她需要的功能。但是如果该功能在同一个gem的未来版本中丢失并且Gemfile中未指定版本,则不同人或不同机器的所有后续gem安装都会产生不良影响。

我遇到了这些问题,特别是对于paginate 3的候选版本。

答案 2 :(得分:0)

我不记得 Bundler 在 2011 年是如何工作的,但是在 2021 年,如果您没有在 Gemfile 中指定版本,则不能假设 Bundler 将始终自动安装最新版本。相反,Bundler 会尝试找到正确的版本组合,以使所有您的 gem 相互兼容。这可能会导致某些 gem 被降级,这可能不是您想要或期望的。 Bundler 会默默地执行此操作,不会出现警告消息,您可能会认为这是一种破坏用户体验的行为。

另一方面,当您指定版本时,如果存在冲突,Bundler 会通知您,然后您可以决定如何继续。

我最近录制了一个截屏视频来展示 an older version of a gem being installed when the Gemfile didn't specify a version number 的真实示例。

答案 3 :(得分:-1)

考虑到所讨论的所有要点,我写了一篇博文。

看看这里 - http://rtdptech.com/2011/09/specifying-gem-versions-in-gemfile-for-rails-application/