ruby rubygems rvm bundler psych

ruby - La instalación limpia OSX 10.9.1 devuelve el "método indefinido` path2class ''"cuando se intenta instalar gemas



rubygems rvm (6)

Acabo de instalar una instalación limpia de Mavericks con Homebrew y RVM. Los rvm requirements brew doctor y rvm requirements devuelven "todo bien", sin embargo, cuando ejecuto bundle install en el directorio de mi proyecto, la mayoría de mis gemas se instalan bien, pero algunos no se instalan con el mismo error:

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.

Luego, si vuelvo a intentarlo con gem install eventmachine -v ''1.0.3'' obtengo:

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

Intenté implosionar RVM y reinstalar, pero nada ayuda.

Otras personas parecen tener el mismo problema, pero nadie parece haber financiado la respuesta todavía:

EDITAR

Mira a esos dos también:


Esta no es una respuesta particularmente perspicaz, pero en mi caso, el problema desapareció al cambiar a ruby-2.1.2 (p95, por cierto) a través de rvm .

Yo iba a actualizar de todos modos ...


Para mí esto resultó ser un problema de permisos. Lo arreglé restableciendo mis permisos en mi carpeta ~/.rvm . Mac OS X 10.9.3.

Primero, encuentra el nombre de usuario de tu sistema:

ls -lA ~ | head

Produce:

-rw-r--r--@ 1 nperry staff 43012 Jul 1 13:25 .DS_Store drwx------ 63 nperry staff 2142 Jul 1 13:40 .Trash ...

Mi nombre de usuario es nperry y mi grupo es staff . Cambie las siguientes líneas para que coincidan con su usuario y grupo.

sudo chown -R nperry:staff ~/.rvm sudo chmod -R ug+rw ~/.rvm

Y no más errores.


Resulta que se trata de un error en una versión anterior de psych, pero no se puede resolver, siempre y cuando instales ruby ​​con gemas RVMs estáticamente vinculadas. Entonces, básicamente, el problema está relacionado con las gemas RVMs estáticamente vinculadas. Instalar rubies con el --disable-binary resuelve el problema:

rvm install 2.0.0-p353 --disable-binary

O vuelva a instalar con:

rvm reinstall 2.0.0-p353 --disable-binary


Tenía el mismo problema y recordé que XCode se había actualizado recientemente. Me acordé de esto porque algunos resultados de Terminal Server afirmaban que las herramientas de desarrollador no estaban instaladas y sugerí ejecutar lo siguiente:

$ xcode-select --install

Todavía no estaba funcionando, así que utilicé rvm para instalar la última versión 2.1 de Ruby, creé un nuevo gemset, señalé mi aplicación para usar ese gemset y ejecuté $ bundle install . Ahora funciona


Tuve el mismo error y miré la gema psicológica

$ gem list --local | grep psych psych (2.0.4, 2.0.0)

como la versión 2.0.4 se instaló recientemente, la eliminé, manteniendo solo la versión 2.0.0

$ gem uninstall psych -v ''2.0.4'' Successfully uninstalled psych-2.0.4

Después de eso, todo funcionó bien otra vez!


Causa inmediata

psych.so no se encuentra en la ubicación adecuada.

Solución / Solución

En mi caso,

cp /usr/local/share/ruby/gems/2.0/gems/psych-2.0.13/lib/psych.so / /usr/share/ruby/vendor_ruby/2.0/


Detalles

path2class método path2class se define en psych_to_ruby.c y se registra en la clase Psych::ClassLoader como un método privado por rb_define_private_method() . El siguiente es el código. Eche un vistazo a la última línea de la función 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); }

Se llama a Init_psych() función Init_psych() , que se define en 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 llama a Init_{library}() después de que carga la biblioteca compartida de la biblioteca (archivo .so). Entonces, en el caso de psych, si se encuentra y carga Init_psych() , se llama a la función Init_psych() y, a su vez, se llama a Init_psych_to_ruby() , y finalmente se registra path2class . Sin embargo, si psych.so no existe, path2class nunca se registra y verá el mensaje de error "método indefinido` path2class ''" .

Probablemente, hay algo mal en el proceso de empaquetado de psych o Ruby.