Bundler不会在生产rails app中加载gem

时间:2013-04-03 09:55:38

标签: ruby-on-rails ruby gem bundler

我遇到一个问题,即在rails应用程序中没有捆绑器加载单个gem,但仅在生产中 - 在开发模式下使用gem没有问题。

gem是country_select,我们已经尝试使用版本1.1.3和github存储库。该应用程序正在使用rails 3.2.11。

证明服务器上存在gem

gem在生产环境中由bundler成功安装:

$ RAILS_ENV=production bundle install
...
Using coffee-rails (3.2.2)
Using country_select (1.1.3)
Using daemons (1.1.9)
...
Your bundle is complete! It was installed into /home/deploy/rails-app/shared/bundle

gem出现在Bundler安装到的共享gem目录中:

$ ls -al /home/deploy/rails-app/shared/bundle/ruby/1.9.1/gems/ | grep country
drwxrwxr-x  3 deploy deploy 4096 Apr  3 08:49 country_select-1.1.3

从控制台启动rails时加载gem:

$ RAILS_ENV=production script/rails c
Loading production environment (Rails 3.2.11)
irb(main):002:0> Gem.loaded_specs.keys.grep /country/
=> ["country_select"]

然而...

对rails应用中country_select gem的相同检查失败。例如:

class ApplicationController < ActionController::Base

  before_filter do
    raise Gem.loaded_specs.keys.grep(/country/).inspect
  end

  #...
end

吐出[] - 即未加载宝石。此外,依赖于gem的应用程序部分因其不存在而失败。

最后,问题

只需在启动时的某处添加require 'country_select'即可意味着加载了gem,并且应用程序正常运行。但是为什么捆绑器没有使用那个特定的gem,尽管它安装它并将它添加到应用程序的gem目录?

有关生产环境的更多信息:

$ rvm -v
rvm 1.18.18 (stable)...
$ ruby -v
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux]
$ gem -v
1.8.25
$ bundle -v
Bundler version 1.3.2

更新:2013年4月5日

问题似乎已经“消失了”。经过几次重新部署后,它似乎正在运作。尽管country_select gem尚未改变,但非常奇怪。我还在调查当时发生了什么变化,但我很困惑。

2 个答案:

答案 0 :(得分:0)

尝试运行

RAILS_ENV=production bundle exec script/rails c

答案 1 :(得分:-1)

我有一个使用相同版本的应用程序,我不需要在dev或生产中需要gem。我也尝试使用您的before_filter并按预期获得["country_select"]。所以问题不在于宝石。

我认为你要么在某个地方(不太可能)初始化时加载了宝石,或者你的服务器周围的设置出了问题。您是否使用RAILS_ENV=production bundle exec script/rails server启动服务器?您能否检查服务器使用的gem路径是否包含您在问题中提到的共享gem路径?