我刚用Homebrew和RVM安装了一个干净的Mavericks安装。 brew doctor
和rvm 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并重新安装,但没有任何帮助。
其他人似乎也有同样的问题,但似乎还没有人为这个答案提供资金:
修改
还可以看到这两个:
答案 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,顺便说一句),问题就消失了。
无论如何我还要升级......