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:
- http://pastebin.com/LV53GdR2
- Error de instalación de Rails "gema no válida: el paquete está dañado"
- Error al instalar rubyracer con el error "gema no válida: el paquete está dañado"
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.