版本化红宝石宝石的最佳实践

时间:2013-02-22 21:20:08

标签: ruby-on-rails version-control rubygems gem versioning

我有一个项目目前正在生产中,但仍在积极开发中。我经常为它添加新的宝石和功能。在我的上一次发布之前,我的一些代码在我的开发环境中崩溃了,我发现这是因为我的一些宝石(特别是CarrierWave和jQuery)已经更新,并且无法使用某些代码。

我的问题是,管理有关版本控制的宝石的最佳方法是什么?有些人似乎说你应该总是在Gemfile中指定版本号...但对于所有宝石?一些?我知道对于某些宝石,你可能 来存储版本号,因为它们存在错误等。但是除了这些之外,在开发过程中有时我会添加新宝石并且可能需要执行{ {1}}让新的东西工作,但不想破坏旧的东西。

我有很好的测试,希望在推送到生产之前能够捕获很多错误,但是在开发过程中,其他用户如何确保gem更新可能不会破坏完全不相关的功能?

1 个答案:

答案 0 :(得分:1)

不幸的是,如果您不希望应用程序因为向后兼容的gem更新而中断,则必须指定gem版本。我发现这是一个很好的做法是使用spermy运算符~>来指定gem版本。例如:

gem carrierwave, '~>0.6.0'

这意味着carrierwave gem将被冻结在版本0.6,但bundle将安装任何次要的,向后兼容的更新和错误修复,这通常是最后一个数字的增量(0.6.1,0.6.2 ......) 。这意味着你可以更新你的软件包而不会有破坏某些东西的风险(在运行bundle update时不再畏缩)。

您还可以在主要版本上使用spermy运算符:

gem devise, '~>2.0'

意义包将更新到版本2.1.0,2.2.0,2.2.1,2.3.0,但从不更新到3.x。

一些注意事项:

  1. 您没有拥有来指定所有宝石版本,但这是一个很好的做法。例如,我没有指定我自己的宝石的版本。但每个第三方gem都指定了其版本。否则,我会把我的代码信任到我无法控制的事情上。

  2. 您仍然需要对gem维护者有一定的信任才能使用spermy运算符。鲁莽的维护者仍然可以在次要版本中发布向后不兼容的更改。在这些情况下,我锁定次要版本(没有精子操作员)。

  3. 如果你指定gem版本,你将使bundle更好地解决gem依赖关系的工作,这意味着他会更快地完成它。

  4. 希望有所帮助。