使用乘客运行Rails 3.0和Rails 3.1应用程序(使用不同的rvm gemsets)

我只是按照这些指示安装了一个新的rvm gemset并在我的本地机器上安装了rails-3.1.0.rc2。 起初我得到一个乘客错误,说rake-0.9.2 gem无法加载,但我发现这提醒我运行“$ passenger-install-apache2-module”。 安装好了提示我将以下内容添加到我的Apache配置文件(/etc/apache2/httpd.conf)中:

LoadModule passenger_module /Users/robs/.rvm/gems/ruby-1.9.2-p180@rails-3.1/gems/passenger-3.0.7/ext/apache2/mod_passenger.so PassengerRoot /Users/robs/.rvm/gems/ruby-1.9.2-p180@rails-3.1/gems/passenger-3.0.7 PassengerRuby /Users/robs/.rvm/wrappers/ruby-1.9.2-p180@rails-3.1/ruby 

但是,不同的gem集中已有三条线:

 LoadModule passenger_module /Users/robs/.rvm/gems/ruby-1.9.2-p180@rails-3.0/gems/passenger-3.0.7/ext/apache2/mod_passenger.so PassengerRoot /Users/robs/.rvm/gems/ruby-1.9.2-p180@rails-3.0/gems/passenger-3.0.7 PassengerRuby /Users/robs/.rvm/wrappers/ruby-1.9.2-p180@rails-3.0/ruby 

如果我留下两组线都没有注释(@ rails-3.1 gemset是最后一个),并重新启动Apache,我的Rails 3.0应用程序将无法启动。 我发现自己必须注释掉rails 3.1 gemset行,重新启动Apache,然后运行“$ rvm use ruby​​-1.9.2-p180@rails.3.0”。 如果我想运行Rails 3.1应用程序,我必须做相反的事情。

有没有办法让两者都能在没有这些额外步骤的情况下同时运行?

这篇文章对您有用。

我用它作为一个例子用nginx设置我自己的开发环境。

您可以告诉Passenger在没有gemset的情况下使用ruby 1.9.2,然后在每个应用程序中运行rvm使用ruby-1.9.2-p180和bundle install。 这意味着您的基础ruby-1.9.2-p180将具有两个应用程序的gem,并且bundler应该处理限制应用程序可用的gem。

最终结果:

  1. ruby-1.9.2-p180有两个应用程序的gem
  2. ruby-1.9.2-p180@rails-3.0为您的3.0应用程序提供了gem
  3. ruby-1.9.2-p180@rails-3.1为您的3.1应用程序提供了gem
  4. 乘客正在使用ruby-1.9.2-p180
  5. bundler仍应限制每个应用程序可用的gem
  6. 两个应用程序应该工作