【问题标题】:Clean install OSX 10.9.1 returns "undefined method `path2class'" when trying to install gems尝试安装 gem 时,全新安装 OSX 10.9.1 返回“未定义的方法 `path2class'”
【发布时间】:2014-02-11 00:33:49
【问题描述】:

我刚刚使用 Homebrew 和 RVM 安装了一个干净的 Mavericks 安装。 brew doctorrvm requirements 都返回“一切都好”,但是,当我在项目目录中运行 bundle install 时,我的大部分 gem 安装正常,但少数安装失败,并出现相同的以下错误:

Bundler::GemspecError: Could not read gem at /Users/NK/.rvm/gems/ruby-2.0.0-p353/cache/eventmachine-1.0.3.gem. It may be corrupted.
An error occurred while installing eventmachine (1.0.3), and Bundler cannot continue.
Make sure that `gem install eventmachine -v '1.0.3'` succeeds before bundling.

然后,如果我用gem install eventmachine -v '1.0.3' 再试一次,我会得到:

ERROR:  Error installing eventmachine:
    invalid gem: package is corrupt, exception while verifying: undefined method `path2class' for #<Psych::ClassLoader:0x000001018f7990> (NoMethodError) in /Users/NK/.rvm/gems/ruby-2.0.0-p353/cache/eventmachine-1.0.3.gem

我尝试内爆 RVM 并重新安装,但没有任何帮助。

其他人似乎也有同样的问题,但似乎还没有人资助答案:

编辑

同时查看这两个:

【问题讨论】:

  • 我遇到了同样的问题,似乎是 Psych 的最新版本出了点问题,它是默认的 Ruby gem 之一。
  • 你试过删除那个路径吗?
  • 你试过安装不同的心理版本吗?

标签: ruby rubygems rvm bundler psych


【解决方案1】:

事实证明,这是旧版 psych 中的一个错误,但无法解决,只要您安装 ruby​​ 与 RVM 静态链接的 gem。所以基本上问题与 RVM 静态链接的 gem 有关。使用--disable-binary 安装红宝石解决了这个问题:

rvm install 2.0.0-p353 --disable-binary

或重新安装:

rvm reinstall 2.0.0-p353 --disable-binary

【讨论】:

  • 我可能还有其他问题,但是当我这样做时,它一开始没有用。所以我首先做了 rvm implode(删除 rvm、ruby、gems 等的所有痕迹),然后使用 --disable-binary 安装解决了问题。
  • 这个解决方案对我有用,但是,我后来在同事的电脑上发现卸载 psych 也可以。由于 MRI 中包含了 psych,因此我们依赖于 psych 的宝石仍然有效。
【解决方案2】:

我遇到了同样的错误并查看了心理宝石

$ gem list --local | grep psych
psych (2.0.4, 2.0.0)

由于最近安装了 2.0.4 版,我将其删除,只保留 2.0.0 版

$ gem uninstall psych -v '2.0.4'
Successfully uninstalled psych-2.0.4

之后,一切又恢复正常了!

【讨论】:

  • 使用旧版本的 psych 类型的作品,但我正在寻找解决方案,而不是解决方法。还是谢谢!
  • 如果使用 RVM 安装了带有静态链接的 ruby​​,这将不起作用(请参阅接受的答案)
  • 抱歉,这只是一种解决方法,感谢@NielsKristian 的解决方案和解释!
【解决方案3】:

直接原因

psych.so 的位置不正确。

解决方案/解决方法

就我而言,

cp /usr/local/share/ruby/gems/2.0/gems/psych-2.0.13/lib/psych.so \
   /usr/share/ruby/vendor_ruby/2.0/


详情

path2class 方法在psych_to_ruby.c 中定义,并由rb_define_private_method() 作为私有方法注册到Psych::ClassLoader 类中。以下是代码。看看Init_psych_to_ruby()函数的最后一行。

static VALUE path2class(VALUE self, VALUE path)
{
#ifdef HAVE_RUBY_ENCODING_H
    return rb_path_to_class(path);
#else
    return rb_path2class(StringValuePtr(path));
#endif
}

void Init_psych_to_ruby(void)
{
    VALUE psych     = rb_define_module("Psych");
    VALUE class_loader  = rb_define_class_under(psych, "ClassLoader", rb_cObject);

    VALUE visitors  = rb_define_module_under(psych, "Visitors");
    VALUE visitor   = rb_define_class_under(visitors, "Visitor", rb_cObject);
    cPsychVisitorsToRuby = rb_define_class_under(visitors, "ToRuby", visitor);

    rb_define_private_method(cPsychVisitorsToRuby, "build_exception", build_exception, 2);
    rb_define_private_method(class_loader, "path2class", path2class, 1);
}

Init_psych_to_ruby() 是从Init_psych() 函数中调用的,该函数在psych.c 中定义。

void Init_psych(void)
{
    mPsych = rb_define_module("Psych");

    rb_define_singleton_method(mPsych, "libyaml_version", libyaml_version, 0);

    Init_psych_parser();
    Init_psych_emitter();
    Init_psych_to_ruby();
    Init_psych_yaml_tree();
}

Ruby 在加载库的共享库(.so 文件)后调用Init_{library}() 函数。因此,在 psych 的情况下,如果找到并加载了 psych.so,则调用 Init_psych() 函数,然后调用 Init_psych_to_ruby(),最后注册 path2class。但是,如果psych.so 不存在,则path2class 永远不会注册,您将看到错误消息“undefined method `path2class'”

很可能,无论是psych还是Ruby的打包过程都有问题。

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,并记得 XCode 最近已更新。我被提醒了这一点,因为一些终端输出声称未安装开发人员工具并建议运行以下命令:

    $ xcode-select --install
    

    它仍然无法正常工作,所以我使用 rvm 安装了最新的 Ruby 2.1 版本,创建了一个新的 gemset,将我的应用程序指定为使用该 gemset 并运行 $ bundle install。现在可以了。

    【讨论】:

      【解决方案5】:

      对我来说,这是一个权限问题。我通过重置我对~/.rvm 文件夹的权限来修复它。 Mac OS X 10.9.3。

      首先,找到您的系统用户名:

      ls -lA ~ | head
      

      生产:

      -rw-r--r--@  1 nperry  staff   43012 Jul  1 13:25 .DS_Store
      drwx------  63 nperry  staff    2142 Jul  1 13:40 .Trash
      ...
      

      我的用户名是nperry,我的群组是staff。更改以下行以匹配您的用户和组。

      sudo chown -R nperry:staff  ~/.rvm
      sudo chmod -R ug+rw ~/.rvm
      

      没有更多错误。

      【讨论】:

        【解决方案6】:

        这不是一个特别有见地的答案,但在我的情况下,通过rvm 切换到ruby-2.1.2(顺便说一句,p95),问题就消失了。

        我还是要升级...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-07
          相关资源
          最近更新 更多