使用Rails 2.3.5绕过机架版本错误

Mat*_*hew 8 rack rubygems ruby-on-rails dreamhost

我目前正在Dreamhost上试图运行Rails 2.3.5应用程序.

这是情况,Dreamhost的服务器安装了Rails 2.2.2.当然,我无法更新共享主机的rails版本,因此我在供应商中冻结了我的Rails.Rails 2.3.5需要机架v1.0.1 gem.Dreamhost使用机架v1.0.0 gem.所以当我尝试定义:

config.gem "rack", :version => "1.0.1"
Run Code Online (Sandbox Code Playgroud)

我明白了:

can't activate rack (~> 1.0.1, runtime) for [], already activated rack-1.0.0 for []
Run Code Online (Sandbox Code Playgroud)

所以我真正需要做的是绕过我的应用程序使用1.0.1的请求,并使用Dreamhost的1.0.0.有谁知道如何配置这个?它甚至可能吗?谢谢您的帮助.

Mik*_*eck 6

Dreamhost现在已经在他们的支持wiki上解决了这个问题.

http://wiki.dreamhost.com/Ruby_on_Rails#Rails_2.3.5_-_Rack_1.0_already_activated_.28fix.29

从该页面:

使用Rails 2.3.5时,Passenger会遇到问题,因为Rack 1.0已经被激活,因此无法加载Rack 1.0.1.

解决这个问题的一种方法是冻结Rails并将Rack gem解压缩到vendor/gems/rack-1.0.1

一旦Rails和Rack在vendor/rails和vendor/gems/rack-1.0.1中,你必须在文件中修改action_controller:vendor/rails/actionpack/lib/action_controller.rb

在行号34和35必须注释掉,并添加以下内容从供应商/宝石加载机架

   load "#{RAILS_ROOT}/vendor/gems/rack-1.0.1/lib/rack.rb"
Run Code Online (Sandbox Code Playgroud)

最终结果应如下所示:

   #gem 'rack', '~> 1.0.1'
   #require 'rack'
   load "#{RAILS_ROOT}/vendor/gems/rack-1.0.1/lib/rack.rb"
Run Code Online (Sandbox Code Playgroud)

真正的问题是Passenger已经加载了Rack 1.0,我相信Passenger必须加载1.0.1才能让这个hack消失.


mty*_*aka 0

您几乎总是希望将应用程序所依赖的 gem 解压到vendor文件夹中。您可以使用以下rake命令来做到这一点:

rake gems:unpack:dependencies
Run Code Online (Sandbox Code Playgroud)

这将在应用程序的根文件夹下创建一个文件夹vendor/gems,并将使用命令声明的所有 gem 解压config.gem到其中。

这不仅可以解决版本不匹配的问题rack,还可以确保您在生产中使用的 gem 版本与在开发中使用的 gem 版本完全相同,这可以防止将来出现许多潜在的麻烦。