【问题标题】:Can't activate gem: how do I figure out which gem has a dependency on this one?无法激活 gem:我如何确定哪个 gem 依赖于这个?
【发布时间】:2010-11-18 08:54:53
【问题描述】:

我收到以下错误:

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"=>[]}

【问题讨论】:

  • 是否有堆栈跟踪?另外,我强烈建议使用 rvm 来防止这些事情发生:rvm.beginrescueend.com
  • 有一个非常短的堆栈跟踪,添加有问题。而且我喜欢 rvm,但无法在此服务器上安装它。
  • 这个问题很具体,可能会被关闭。
  • 我不知道,我想“我如何确定哪个 gem 或库依赖于 X?”是一个有用的问题......这个问题可能可以编辑成形状而不是仅仅关闭。

标签: ruby-on-rails ruby rubygems


【解决方案1】:

如果你使用 Bundler,你可以避免这个问题,你有一个非常棒的命令:bundle viz

此命令生成一个包含所有依赖项的图表。

【讨论】:

  • 是的,但我没有,这是一个旧版应用程序。
【解决方案2】:
require 'rubygems'
require 'pp'
h = {}
Gem.source_index.each{|g, spec| h[g] = spec.dependencies.map{|d| d.name} }
pp h

【讨论】:

    【解决方案3】:

    我发现 rfeedparser 是使用 hpricot 0.6 的 gem。

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

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

    不幸的是,我发现使用旧版 Rails(我们有一个 2.2.2 应用程序)进行这项工作的唯一方法是卸载任何不是 0.6 的 hpricot 版本。

    【讨论】:

      【解决方案4】:

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

      加载较新版本的 hpricot 的另一个原因可能是您使用的另一个 gem 取决于该版本的 hpricot,这意味着您不能使用这两个 gem 的特定版本,因为它们有冲突的要求为他们的 hpricot 版本。

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

      【讨论】:

      • 我使用的是 0.8.3 版本的 hpricot - 只是找不到依赖于 0.6.161 版本的 gem。我已将依赖项输出添加到问题中。
      • 显然所有本地安装的gem都被加载了,因为我只使用了3个,但我不知道为什么。
      • 也许是您的 rails 应用程序中提供的插件或 gem,它提供了 hpricot 0.6.161?检查vendor/plugins/**/vendor/vendor/gems/**/vendor/ 看看里面是否有hpricot。他们可能将 gem 冻结在那个版本,但没有指定它。
      【解决方案5】:

      您可以尝试 grepping 您的加载路径:

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

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 2012-05-09
        • 2020-08-04
        • 1970-01-01
        • 1970-01-01
        • 2012-10-12
        • 2013-02-11
        • 1970-01-01
        • 2012-08-19
        相关资源
        最近更新 更多