我应该在我的Gemfile中放置gem版本吗?

时间:2013-01-21 11:48:00

标签: ruby-on-rails ruby-on-rails-3

直到现在,我只是使用宝石名称并避免提及版本号,这是一个很好的做法(专业人士:宝石不断自动更新,缺点:应用程序可以破解)

如果使用版本号是个好主意,使用它的标准做法是什么?

编辑 - 我只是做了“捆绑秀”,它显示了大约30多个宝石,即使我在Gemfile中只列出了6个宝石,我假设其余的是在我创建应用时安装的核心宝石,所以如何锁定它们还是应该让它们不受影响?

5 个答案:

答案 0 :(得分:2)

我认为,因为在早期我遇到了很多宝石问题,这些宝石都是自己更新的,而不是向后兼容的。

通常,当您从一个主要版本切换到另一个主要版本时会发生这种情况,对我而言,它是Rails 2.x到3.x.

所以最重要的是在Gem文件中有版本。

答案 1 :(得分:2)

我一开始也这么认为。

但是会有一些更新不符合我编码的内容,或者会有不兼容的更改导致功能停止工作。

至少两次我碰巧在宝石推动的那一刻我会更新一颗宝石而且我是最初几个看到它全部因为一些未修复的错误而破坏的宝石之一推动。因此,您尝试调试,它将无法正常工作。从那以后,我会锁定有问题的宝石,只有当我正在做的事情时才升级它们,并确保功能保持不变。

建议使用您知道可行的版本。

之后,您可以使用gemnasium跟踪宝石

答案 2 :(得分:2)

我的建议是

原因在于我将外部依赖关系视为潜在的突破点,因为它们在某种程度上不受我的控制;任何未由我发起的外部依赖都可能导致失败的变化。

由于软件开发已经很复杂,我强烈认为限制和控制外部依赖关系的变化对我们有利。

维护代码的难易程度越小。

HTH

答案 3 :(得分:2)

bundler的目的之一是将您的gem依赖项固定到特定版本。因此,在您向Gemfile添加gem之后的第一个bundle上,无论如何都会将gems固定到特定版本。您必须专门执行bundle update <gemname>才能对特定gem进行更新。仅bundle update(将所有宝石更新为最新的兼容版本)在很大程度上破坏了捆绑器的目的,应该避免使用。

说,我认为如果有一个特定的原因,我应该只提到Gemfile中的版本。示例:您希望专门运行rails版本3.2.8,或者必须使用ruby-net-ldap 0.0.1,因为0.0.2会破坏某些功能。

答案 4 :(得分:1)

使用确切的版本号很好。您可能总是将其锁定为主要版本,或者从不指定任何版本,并且没关系,但如果您真的想要这种精细的控制级别并且在其他计算机上运行时对程序有100%的信心,使用确切的版本号。

我一直处在没有指定确切版本号的情况下,当我或其他人做了bundle install时,该项目因为进入了更新的版本而崩溃了。在部署到生产环境时,这可能会特别糟糕。

Bundler确实会锁定您的gem规范,但如果您告诉它只使用主要版本,那么它会将其锁定。

此外,如果没有Gemfile.lock,将代码部署到生产将是一个主要问题,因为依赖项和gem版本可能会发生变化。