干净安装OSX 10.9.1在尝试安装gem时返回“undefined method`path2class’”
我刚用Homebrew和RVM安装了一个干净的Mavericks安装。 brew doctor
和rvm 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,顺便说一句),问题就消失了。
无论如何我还要升级……