无法激活gem:我如何确定哪个gem依赖于这个?

时间:2010-11-18 08:54:54

标签: ruby-on-rails ruby rubygems

我收到以下错误:

Gem::Exception: can't activate hpricot (= 0.6.161, runtime), 
already activated hpricot-0.8.3

0.6在本地安装,0.8.3在我的应用程序中冻结。

这是我的“堆栈跟踪”:

Loading production environment (Rails 2.3.10)
/software/ruby-ror-gem-1.3.1/lib/rubygems.rb:149:in `activate':Gem::Exception: can't activate hpricot (= 0.6.161, runtime), already activated hpricot-0.8.3
/e/app/www.example.com/rails/releases/20101117142713/vendor/rails/railties/lib/console_with_helpers.rb:5:NameError: uninitialized constant ApplicationController

如何确定哪个gem或库依赖hpricot 0.6?


我在下面添加了user438962命令的输出:

{"daemons-1.0.9"=>[],
 "scgi_dp_rails-0.0.5"=>["preforkdp", "daemons"],
 "rails-2.3.10"=>[],
 "rwfd-0.1.0"=>[],
 "nokogiri-1.3.2"=>["racc", "rexical", "rake-compiler", "hoe"],
 "activesupport-2.3.10"=>[],
 "rack-1.0.1"=>
  ["test-spec",
   "camping",
   "fcgi",
   "memcache-client",
   "mongrel",
   "ruby-openid",
   "thin"],
 "rack-1.1.0"=>
  ["test-spec", "camping", "fcgi", "memcache-client", "mongrel", "thin"],
 "preforkdp-0.1.2"=>["rwfd"],
 "activerecord-2.3.10"=>[],
 "hpricot-0.6.161"=>[],
 "cgi_multipart_eof_fix-2.5.0"=>[],
 "fastthread-1.0.1"=>[],
 "gem_plugin-0.2.3"=>[],
 "activeresource-2.3.10"=>[],
 "ferret-0.11.6"=>["rake"],
 "mysql-2.7"=>[],
 "actionmailer-2.3.10"=>[],
 "actionpack-2.3.10"=>[],
 "hpricot-0.8.3"=>[],
 "mongrel_upload_progress-0.2.2"=>["mongrel", "gem_plugin"],
 "mongrel-1.1.3"=>
  ["gem_plugin", "daemons", "fastthread", "cgi_multipart_eof_fix"],
 "mongrel_cluster-1.0.5"=>["gem_plugin", "mongrel"],
 "rake-0.8.4"=>[],
 "haml-2.0.9"=>[],
 "remvee-mini_magick-1.2.3.4.0"=>[]}

5 个答案:

答案 0 :(得分:2)

如果您使用Bundler,则可以避免此问题,并且您拥有非常棒的命令:bundle viz

此命令生成包含所有依赖项的图形。

答案 1 :(得分:1)

require 'rubygems'
require 'pp'
h = {}
Gem.source_index.each{|g, spec| h[g] = spec.dependencies.map{|d| d.name} }
pp h

答案 2 :(得分:1)

我发现rfeedparser是使用hpricot 0.6的宝石。

问题是此版本(0.6)与rfeedparser一起使用,但会发出警告“不要将参数传递给XML :: SaxParser.new”。

嗯,对于更新版本的hpricot(至少0.8.2),此警告似乎已生效,因为现在具有该版本的hpricot或更新版本会导致“ArgumentError:错误的参数数量(1表示0)”调用FeedParser.parse(url)。

不幸的是,我发现使用传统Rails(我们有一个2.2.2应用程序)的唯一方法是卸载任何不是0.6的hpricot版本。

答案 3 :(得分:0)

问题在于您使用的宝石之一取决于hpricot版本0.6.161 所以尝试加载它,但你已经加载了hpricot-0.8.3。如果您自己使用hpricot,可能会加载更新版本,并且在未指定版本的情况下需要使用hpricot。如果是这种情况,您可以将自己的要求更改为与其他gem使用的版本相同(0.6.161)。

加载更新版本的hpricot的另一个原因可能是你使用的另一个gem依赖于那个版本的hpricot,这意味着你不能使用这两个宝石的特定版本,因为它们有冲突要求他们的hpricot版本。

使用其他用户发布的方法来帮助您追踪您正在使用的宝石的依赖关系。

答案 4 :(得分:0)

您可以尝试点击加载路径:

$:.each do |dir|
  cmd = %(grep -r hpricot #{dir})
  puts cmd
  puts `#{cmd}`
end