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

Posted

技术标签:

【中文标题】是否为 rails 应用程序在 Gemfile 中强制指定 Gem 版本【英文标题】:Whether to specify Gem versions compulsorily in Gemfile or not for rails application 【发布时间】:2011-11-11 22:49:39 【问题描述】:

我想知道是否应该为我添加到 Gemfile 的每个 gem 指定 gem 版本。早些时候,在我的几个项目中,我没有为所有的 gems 指定任何版本,并且 bundler 处理了它,这也很好。

但最近我开始从事过去 6 个月正在开发的几个项目。在该项目中,许多 gem 版本仅在 Gemfile 中指定,而 Gemfile.lock 被忽略。这让最终解决版本冲突和升级几个 gem 非常头疼。

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

所以,我的问题是我应该为我在 Gemfile 中指定的每个 gem 指定版本,还是只指定名称和捆绑程序将处理版本?处理此问题的最佳做法是什么?

更新 -

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

问题 1 - 每个开发人员都应该拥有相同版本的 gem。 实际上将 Gemfile.lock 添加到版本控制中解决了这个问题。开发人员只需要注意他们运行“捆绑安装”/“捆绑”而不是“捆绑更新”,因为这也会更新版本。

问题 2 - 某些 gems 版本,如果更改,会阻止应用程序代码。 实际上,对于omniauth,存在此类问题,因为API从一个版本更改为另一个版本。是的,为了让应用程序正常工作,需要为此 gem 指定版本。

我的概率。 - 因此,在我的 gemfile 中,由于 A 和 B 的版本都被严格指定,并且它们都依赖于不同版本的 Z,因此存在依赖关系,我什至无法运行捆绑安装或捆绑更新。唯一的解决方案是删除版本并让 bundler 接听电话。这就是为什么我有这样的问题 - Gemfile.version_specification_mandatory? #=> 真/假

【问题讨论】:

好问题。这也回答了我对此的好奇心,因为我一直在指定 gem 版本! 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

是的,我同意 Ruder 的观点。我还更新了我到底在寻找什么的问题。谢谢。【参考方案3】:

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

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

我遇到了这些问题,尤其是对 3 的候选发布版本进行分页。

【讨论】:

其实如果你分享Gemfile.lock那么你上面提到的问题就不会出现了。当开发人员第一次添加 gem 并运行“捆绑程序”时,该版本被锁定,并将被 Gemfile.lock 中的所有开发人员使用。我真正想知道的是 - 由于 Gemfile.lock 专门用于锁定版本,我们是否仍应在 Gemfile 中指定版本作为授权?

以上是关于是否为 rails 应用程序在 Gemfile 中强制指定 Gem 版本的主要内容,如果未能解决你的问题,请参考以下文章

Gemfile.lock 在 Rails 中使用?

捆绑安装后Rails 3 Gemfile Gems未加载

为啥 Rails4 放弃了对 Gemfile 中“资产”组的支持

Rails:Gemfile.lock 需要“找不到捆绑程序”(2.2.11)。 (Gem::GemNotFoundException)

Ruby on Rails 中的 Gemfile 和 Gemfile.lock 有啥区别

为什么gem`therubyracer`默认在Gemfile中注释掉了?