ruby-on-rails-3.2之当我的 gem 列表显示时,为什么 Passenger 说找不到我的 gem 'json'

Leo_wl 阅读:53 2025-06-02 22:19:02 评论:0

我的 Apache 服务器上的 Ruby on Rails phusion passenger 收到以下错误消息:

It looks like Bundler could not find a gem. This is probably because your 
application is being run under a different environment than it's supposed to. 
Please check the following: 
 
 * Is this app supposed to be run as the `rvm_admin` user? 
 * Is this app being run on the correct Ruby interpreter? Below you will 
   see which Ruby interpreter Phusion Passenger attempted to use. 
 * Are you using RVM? Please check whether the correct gemset is being used. 
 * If all of the above fails, try resetting your RVM gemsets: 
   https://github.com/phusion/passenger/wiki/Resetting-RVM-gemsets 
 
-------- The exception is as follows: ------- 
Could not find json-1.8.1 in any of the sources (Bundler::GemNotFound) 

这很奇怪,因为当我执行 gem list 命令时:

rvm_admin@myserver:~$ gem list 
 
*** LOCAL GEMS *** 
 
actionmailer (3.2.16) 
actionpack (3.2.16) 
activemodel (3.2.16) 
activerecord (3.2.16) 
activeresource (3.2.16) 
activesupport (3.2.16) 
annotate (2.6.1) 
arel (3.0.3) 
atomic (1.1.14) 
bcrypt-ruby (3.1.2) 
bigdecimal (1.2.3) 
builder (3.0.4) 
bundler (1.5.2) 
capistrano (3.0.1) 
chunky_png (1.2.9) 
coffee-rails (3.2.1) 
coffee-script (2.2.0) 
coffee-script-source (1.7.0) 
compass (0.12.2) 
compass-rails (1.1.3) 
declarative_authorization (0.5.7) 
devise (3.2.2) 
diff-lcs (1.2.5) 
erubis (2.7.0) 
execjs (2.0.2) 
faker (1.2.0) 
fssm (0.2.10) 
haml (4.0.5) 
haml-rails (0.4) 
hike (1.2.3) 
i18n (0.6.9) 
io-console (0.4.2) 
journey (1.0.4) 
jquery-rails (3.1.0) 
json (1.8.1) 
libv8 (3.16.14.3 x86_64-linux) 
mail (2.5.4) 
mime-types (1.25.1) 
minitest (4.7.5) 
multi_json (1.8.4) 
net-scp (1.1.2) 
net-ssh (2.7.0) 
orm_adapter (0.5.0) 
pg (0.17.1) 
polyamorous (0.6.4) 
polyglot (0.3.3) 
psych (2.0.2) 
rack (1.4.5) 
rack-cache (1.2) 
rack-ssl (1.3.3) 
rack-test (0.6.2) 
rails (3.2.16) 
rails-translate-routes (0.1.3) 
railties (3.2.16) 
rake (10.1.1, 10.1.0) 
rdoc (4.1.0, 3.12.2) 
ref (1.0.5) 
role_model (0.8.1) 
rspec-core (2.14.7) 
rspec-expectations (2.14.4) 
rspec-mocks (2.14.4) 
rspec-rails (2.14.1) 
ruby-ole (1.2.11.7) 
sass (3.2.14) 
sass-rails (3.2.6) 
schema_plus (1.3.2) 
spreadsheet (0.9.6) 
sprockets (2.2.2) 
squeel (1.1.1) 
sshkit (1.0.0) 
term-ansicolor (1.2.2) 
test-unit (2.1.0.0) 
therubyracer (0.12.0) 
thor (0.18.1) 
thread_safe (0.1.3) 
tilt (1.4.1) 
timeliness (0.3.7) 
tins (0.13.1) 
treetop (1.4.15) 
tzinfo (0.3.38) 
uglifier (2.4.0) 
validates_timeliness (3.0.14) 
valuable (0.9.8) 
warden (1.2.3) 

json 似乎在那里

但是如果我做一个

rvm_admin@myserver:~$ bundle show json 
Could not locate Gemfile 

这是为什么?

有关信息,这是我的gemsets:

rvm_admin@myserver:~$ rvm gemset list 
 
gemsets for ruby-2.1.0 (found in /usr/local/rvm/gems/ruby-2.1.0) 
=> (default) 
   global 

所以除了全局的之外没有其他的 gemsets。

这是我的Gemfile:

source 'https://rubygems.org' 
gem 'rails', '~>3.2' 
gem 'pg', '>= 0.14' 
gem 'haml-rails' , '>= 0.3' 
gem 'execjs' 
gem 'therubyracer', :platforms => :ruby 
 
group :development, :test do 
  gem 'factory_girl_rails' 
end 
 
group :developpement do 
  gem 'rspec-rails', '~> 2.11' 
  gem 'capistrano', '~> 3.0.1' 
  gem 'faker', '>= 1.0' 
  gem 'sshkit', '~> 1.0.0' 
end 
 
group :test do 
  gem 'rspec', '>= 2.11' 
  gem 'webrat', '>= 0.7' 
  gem 'spork-rails', '>= 3.2' 
end 
 
group :assets do 
  gem 'sass-rails',   '>= 3.2.3' 
  gem 'coffee-rails', '>= 3.2.1' 
  gem 'compass-rails', '>= 1.0' 
  gem 'uglifier', '>= 1.0.3' 
end 
 
gem 'jquery-rails' 
gem 'annotate' 
gem 'spreadsheet' #, '~> 0.7' 
gem 'schema_plus' #, :git => "git://github.com/lomba/schema_plus.git" 
gem 'squeel' #, '~> 1.0' 
gem 'devise' #, '~> 2.1' 
gem 'role_model' 
gem 'declarative_authorization' 
gem 'rails-translate-routes'  #, '~> 0.1' 
gem 'validates_timeliness'  #, '~> 3.0' 

我使用 bundle install --without developement test 命令手动安装 gem。 我不希望 Capistrano 执行任何类型的服务器包安装。所以我卸载了诸如 capistrano-rvmcapistrano-rails 之类的 gem。

怎么了?我该怎么办?

=== 编辑

如果我进入我的应用程序文件夹并检查 Json,它似乎存在:

rvm_admin@myserver:/var/www/odpf/current$ bundle show json 
The gem json has been deleted. It was installed at: 
/usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/gems/2.1.0/gems/json-1.8.1 

请您参考如下方法:

我解决了这个问题。 问题来自 Phusion passenger ruby​​ interpreter string

由于 Phusion passenger 现在不再是 gem,而是一个包,apt-get 将安装一个依赖包:一个旧版本的 ruby​​ 包

所以即使我安装了一个带有 RVM 的 ruby​​ 版本(ruby 2.1.0),Phusion Passenger 使用的是/usr/bin/ruby 包中提供的版本(1.9.3),因此 Passenger 不知何故看起来将 gem 放入此解释器文件夹中。当然,他找不到所需的 gem,因为它们是根据 ruby​​ 2.1.0 而不是 ruby​​ 1.9.3 安装的。

执行 rvm gemset list 命令将显示当前使用的是哪个 gemset,但不幸的是,我们无法假设当我们安装 gem 时它们会进入当前 gemset。 它比那更复杂和晦涩。似乎安装 gems 的文件夹位置很重要。 此外,gem list 命令显示的 gems 几乎无法解决 gems 问题。在服务器上安装 ruby​​ 环境真的很痛苦....

bundler web site部署页面对此进行了“一点”解释。我从来没有找到关于 rvm 和 bundler 如何管理 gems 的详细解释。

为了解决这个问题,我不得不执行以下命令

passenger-config --ruby-command 

输出给了我“ruby interpreter command”来复制并粘贴到我的 /etc/apache2/sites-available/mysite apache 配置文件:

PassengerRuby /usr/local/rvm/gems/ruby-2.1.0/wrappers/ruby 

但是我将它放在我的配置文件的全局部分中的 PassengerDefaultRuby 参数中,以确保任何 ruby​​ 帮助工具都使用此版本且仅使用此版本的 ruby​​ 2.1.0:

PassengerDefaultRuby /usr/local/rvm/gems/ruby-2.1.0/wrappers/ruby 

有关如何设置 ruby​​ 解释器字符串的更多信息 已说明 here在“RVM 帮助工具”部分。

强烈推荐阅读。


标签:json
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号