干净安装OSX 10.9.1在尝试安装gem时返回“undefined method`path2class'”

时间:2014-02-11 00:33:50

标签: ruby rubygems rvm bundler psych

我刚用Homebrew和RVM安装了一个干净的Mavericks安装。 brew doctorrvm requirements都返回“all good”,但是,当我在我的项目中运行bundle install目录时,我的大多数宝石安装都很好,但是少数几个安装失败并且出现相同的错误:

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并重新安装,但没有任何帮助。

其他人似乎也有同样的问题,但似乎还没有人为这个答案提供资金:

修改

还可以看到这两个:

6 个答案:

答案 0 :(得分:40)

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

rvm install 2.0.0-p353 --disable-binary

或重新安装:

rvm reinstall 2.0.0-p353 --disable-binary

答案 1 :(得分:22)

我有同样的错误,并查看了心灵宝石

$ 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

之后,一切都恢复正常!

答案 2 :(得分:1)

直接原因

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中定义,并在Psych::ClassLoader类中作为私有方法注册到rb_define_private_method()。以下是代码。看一下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.so,则调用Init_psych()函数,然后调用Init_psych_to_ruby(),最后注册path2class。但是,如果psych.so不存在,则永远不会注册path2class,您将看到错误消息&#34;未定义的方法`path2class&#39;&#34;

可能,在心理或Ruby的包装过程中出现了问题。

答案 3 :(得分:0)

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

$ xcode-select --install

它仍然没有工作所以我使用rvm安装最新的2.1版本的Ruby,创建了一个新的gemset,指出我的应用程序使用该gemset并运行$ bundle install。它现在有效。

答案 4 :(得分:0)

对我来说,这是一个权限问题。我通过重置我的~/.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

不再有错误。

答案 5 :(得分:0)

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

无论如何我还要升级......