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

我刚用Homebrew和RVM安装了一个干净的Mavericks安装。 brew doctorrvm requirements返回“all good”,但是,当我在我的项目中运行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 # (NoMethodError) in /Users/NK/.rvm/gems/ruby-2.0.0-p353/cache/eventmachine-1.0.3.gem 

我试图破坏RVM并重新安装,但没有任何帮助。

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

  • http://pastebin.com/LV53GdR2
  • 安装Rails错误“无效的gem:包已损坏”
  • 安装rubyracer时出错,错误“gem gem:package is corrupt”

编辑

看到这两个:

  • https://github.com/tenderlove/psych/issues/182
  • https://github.com/wayneeseguin/rvm/issues/2620

事实certificate,这是一个老版本的心理错误,但它无法解决,只要你安装ruby与RVMs静态链接的gem。 所以基本上问题与RVM静态链接的gem有关。 使用--disable-binary安装rubies可以解决问题:

 rvm install 2.0.0-p353 --disable-binary 

或重新安装:

 rvm reinstall 2.0.0-p353 --disable-binary 

我有同样的错误,并调查了心灵gem

 $ 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.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的情况下,如果发现并加载了Init_psych()则调用Init_psych()函数,然后Init_psych_to_ruby() ,最后注册path2class 。 但是,如果psych.so不存在,则path2class永远不会注册,您将看到错误消息“undefined method`path2class’”

也许,在精神或Ruby的包装过程中存在一些问题。

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

 $ xcode-select --install 

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

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

没有更多的错误。

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

无论如何我还要升级……