冻结Rails版本/宝石有什么意义?

时间:2009-04-28 19:07:43

标签: ruby-on-rails ruby rubygems freeze

这是什么意思?

在一个项目的说明中,它说“冻结Rails宝石”。这与冻结Rails版本不同吗?

什么是冻结?

4 个答案:

答案 0 :(得分:21)

如果您使用的某个gem的作者之一引入了新版本的gem,则新版本可能会引入向后不兼容的更改,从而破坏您的代码。

冻结gem会将其放入应用程序的vendor文件夹中,并且不会自动更新。 Rails将使用此版本的gem。

这允许您为您的系统更新其他应用程序的gem,同时让您的唯一应用程序使用您一直使用的gem版本,因此是稳定的。

这也适用于rails gem本身,因为较新版本的rails可能最终导致应用程序中的某些内容中断,冻结它会阻止系统更新(并且,再一次,允许您更新其他应用程序)机器,在离开应用程序时,你会在该版本号上冻结导轨。

答案 1 :(得分:4)

我认为Phillc的评论让人头疼。

只要您的应用程序在生产环境中运行,人们依赖于工作,您就必须拥有一种“冻结”环境的机制。更新rails可能会导致应用程序无法正常工作。

这可能是次要的事情或阻止用户完成工作的事情。

只是谷歌'rails gem update打破了我的应用'才能看到一些祸患。

Igor Minar有一个很好的博客文章,说明为什么要冻结gems和Rails,以及讨论如何在Rails中设置特定的gem版本依赖关系。

你可以冻结Rails,你可以冻结宝石,你可以在environment.rb文件中设置对特定gem版本的依赖。

您这样做的原因是为了确保在发布gem或Rails的更新版本时您的应用不会中断。冻结允许您在单独的计算机上测试更新,确保它通过所有自动化测试套件,让您的用户按照其步调放置更新的应用程序,然后(在良好的备份之后)将更新应用于gem或轨。

答案 2 :(得分:2)

冻结很棒 - 正如其他人所说,它可以减少您对外部环境的依赖。如果您使用共享主机,或者无法完全控制部署位置,这一点尤其重要。

但是,rake和capistrano等程序在Rails环境中运行可能会有问题。他们有自己的宝石加载路径,你可以影响,但你需要知道它。此外,无法冻结具有本机扩展(libxml,hpricot,...)的gem,因为特定于操作系统的位仍然需要存在于外部OS中。

此外,现在可能不是一个问题但需要注意的事项--Rails 3将转向一种管理插件,宝石和供应商目录的新方法。现在一切都搞得一团糟。

答案 3 :(得分:1)

Here's a tutorial用于冻结rails应用程序。