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

我目前正在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" 

我明白了:

 can't activate rack (~> 1.0.1, runtime) for [], already activated rack-1.0.0 for [] 

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

您几乎总是希望将应用程序所依赖的gem解压缩到vendor文件夹中。 您可以使用此rake命令执行此操作:

 rake gems:unpack:dependencies 

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

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

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必须注释掉,并添加以下内容从供应商/gem加载机架

  load "#{RAILS_ROOT}/vendor/gems/rack-1.0.1/lib/rack.rb" 

最终结果应如下所示:

  #gem 'rack', '~> 1.0.1' #require 'rack' load "#{RAILS_ROOT}/vendor/gems/rack-1.0.1/lib/rack.rb" 

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

rake gems:unpack:dependencies不允许你将rake解压缩到你的vendor / gems文件夹中。

对于Dreamhost问题,你必须做Matt所说的。 将导轨冻结至2.3.4。

 rake rails:freeze:gems VERSION=2.3.4 

Dreamhost使用旧版本的Passenger预装机架1.0.0。 一旦预装了机架1.0.0,就无法加载机架1.0.1。 因此,DH最新版本的rails可能是Rails 2.3.4和Rack 1.0.0。

我尝试升级到2.3.5时遇到了同样的问题。

我想知道你在哪台服务器仍然运行Rails 2.2.2? 我认为Dreamhost现在已经把所有人都移到了2.3.4。 我在3个月前和他们抱怨过,他们在第二天就在我的服务器上升级了Passenger,所以我可以安装当前的Rails版本。 因此,如果Rails 2.3.5对您的应用程序至关重要,我建议您提交支持服务单。 但2.3.4和2.3.5之间没有太多变化,因此您的应用程序在2.3.4上运行的可能性也很大。 您是否尝试在售卖2.3.4上运行它?

这不是一个缺少的gem,它是关于一个gem,需要两次不匹配的版本。 rake gems:unpack:dependencies不能解决这个问题(我试过)。

我怀疑Dreamhost的Passenger版本再次出现问题。 我的服务器(buenosaires)有乘客2.2.5。 最新的乘客版本是2.2.7。

一个简单的gem更新机架对我来说不起作用,因为Rails 2.3.5似乎特别想要Rack 1.0.1。 所以,当我做了一个gem更新架-v = 1.0.1时,Rails 2.3.5就开始了。

显然,Rails想要机架1.0.1的整个事情是actionpack中的一个小的依赖性要求错误,可以很容易地解决。

对我来说,编辑第34行上的vendor/rails/actionpack/lib/action_controller.rb就足够了,从vendor/rails/actionpack/lib/action_controller.rb gem 'rack', '~> 1.0.1'vendor/rails/actionpack/lib/action_controller.rb gem 'rack', '~> 1.0' ,问题就消失了。

请参阅: https : //rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/3685-actionpack-235-gem-declares-incompatibility-with-rack-110

Dreamhost正在更新Rack and Rails: http : //www.dreamhoststatus.com/2009/12/21/ruby-gem-updates/

我猜这解决了。

我认为目前最好的解冻一切并使用dreamhost上的内容。 他们目前有2.3.4的轨道,如果你可以等待一两天 – dreamhost正在将rails gems升级到2.3.5(它应该在昨天的12月21日已经升级 – 但由于某种原因他们没有解释他们是仍然在2.3.4)。

FWIW,我可以确认冻结gem并不能解决问题; 事实上,在我的部署爆炸之前(使用DH的Rack 0.3.0,不知何故!),现在我的旋转爆炸与上面看到的相同错误。 如果我想完成任何工作,也许是时候将我的玩具/概念validation应用程序移动到“真实”主机了。

更新:我的服务器于2009年12月24日升级到Rack 1.0.1,为我解决了这个问题。 如果您的帐户仍然遇到问题,我建议您使用短信服务; 在我的情况下他们是相当敏感的(通过电子邮件,而不是行动,但是为了价格你真的不能拥有它)。