在 Rails 应用程序中升级 Ruby 版本和 gemsets 的安全方法

Safe way to upgrade Ruby versions and gemsets in Rails applications

我想升级我们的 Ruby 版本和我们目前正在 运行ning 的生产网站上的一堆 gem。我们使用 RVM 来管理我们的 Ruby 版本和 gemsets。

我知道如何使用 RVM 安装新的 Ruby 版本并在 gemset 中安装 gem。我也明白,如果我 运行 bundle install 它会将我的 gems 安装到 Ruby 版本中,我正在 运行 从中执行命令。

有没有什么方法可以预先创建一个包含 gemset 的 Ruby 版本,然后交换我的生产站点以使用这个新的 Ruby 版本和 gemset?我知道这可以手动完成,但无论如何都可以用 gemfile 来完成吗?

是的,您可以在 Gemfile 中指定 Ruby 版本:

source 'https://rubygems.org'
ruby '2.1.3'

例如,这允许您设置部署到 Heroku 时将使用的版本。你的问题没有详细说明你的生产环境,所以不清楚是否可以使用Gemfile中的Ruby版本。

在本地,该应用程序将 运行 针对任何 Ruby 与 RVM 一起激活的版本。知道它是否有效的唯一方法是 运行 新 Ruby 版本的规格。你的问题没有提到规格,但如果你有一套完整的规格,那么这是确定新 Ruby 版本是否有效的正确方法。

您可以整天安装 Ruby 和 gem 集的新版本,而不会影响 运行 应用程序。一旦应用程序 运行,它会一直在 Ruby 的相同版本下继续 运行。

您可以让 RVM 安装新的 Rubies、操作 gem 集合等,只要您不删除应用程序需要的 Ruby 版本。如果二进制文件消失,如果系统需要加载已删除的内容,您的应用可能 crash/lock-up。

这完全取决于您的设置。我正在回答 Passenger/Apache 设置。

使用 Passenger 和 Apache,您可以在 Apache Vhost 文件中设置我的 PassengerRuby,以便它使用特定版本的 Ruby,我会将其设置为您当前的 ruby路径并像这样重新启动 Apache:

PassengerRuby <path-to-ruby>

然后您可以安装新的 ruby 版本和 gem,安装完所有内容后,您可以将 PassengerRuby 更改为新的 ruby 路径并重新启动 Apache。这应该可以顺利迁移您的 Ruby 版本,因为您始终可以回退到旧的 Ruby 版本。