17

我刚刚使用 Homebrew 和 RVM 安装了一个干净的 Mavericks 安装。然而,当我在我的项目目录中运行时,两者都brew doctor返回rvm 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 并重新安装,但没有任何帮助。

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

编辑

也可以看看这两个:

4

6 回答 6

40

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

rvm install 2.0.0-p353 --disable-binary

或重新安装:

rvm reinstall 2.0.0-p353 --disable-binary
于 2014-02-24T13:27:04.297 回答
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

之后,一切再次正常!

于 2014-02-23T00:45:51.480 回答
2

直接原因

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();
}

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

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

于 2015-05-08T07:28:05.237 回答
0

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

$ xcode-select --install

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

于 2014-04-12T23:53:06.787 回答
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

并且没有更多的错误。

于 2014-07-01T18:05:06.140 回答
0

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

反正我是要升级的。。。

于 2014-09-21T08:41:58.820 回答