我遇到一个问题,即在rails应用程序中没有捆绑器加载单个gem,但仅在生产中 - 在开发模式下使用gem没有问题。
gem是country_select,我们已经尝试使用版本1.1.3和github存储库。该应用程序正在使用rails 3.2.11。
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
问题似乎已经“消失了”。经过几次重新部署后,它似乎正在运作。尽管country_select gem尚未改变,但非常奇怪。我还在调查当时发生了什么变化,但我很困惑。
答案 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路径?