Чистая установка OSX 10.9.1 возвращает "undefined метод" path2class "при попытке установить драгоценные камни
Я только что установил чистую установку Mavericks с Homebrew и RVM. Однако brew doctor
и rvm requirements
возвращают "все хорошо", однако, когда я запускаю 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 и переустановить, но ничего не помогает.
У других людей, похоже, есть одна и та же проблема, но никто, похоже, еще не получил ответа:
ИЗМЕНИТЬ
Смотрите также эти два:
Ответы
Ответ 1
Оказывается, это ошибка в более старой версии психики, но она не может быть решена, если вы установили ruby с RVM статически связанными драгоценными камнями. Таким образом, в основном проблема связана с статично связанными драгоценными камнями RVM. Установка рубинов с помощью --disable-binary
решает проблему:
rvm install 2.0.0-p353 --disable-binary
Или переустановить с помощью:
rvm reinstall 2.0.0-p353 --disable-binary
Ответ 2
У меня была такая же ошибка и посмотрел на психический камень
$ 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
После этого все снова работало отлично!
Ответ 3
Немедленная причина
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 вызывает функцию Init_{library}()
после загрузки библиотечной библиотеки (файл .so). Итак, в случае с психикой, если psych.so
найден и загружен, вызывается функция Init_psych()
и, в свою очередь, вызывается Init_psych_to_ruby()
, и, наконец, path2class
регистрируется. Однако, если psych.so
не существует, path2class
никогда не регистрируется, и вы увидите сообщение об ошибке "undefined method" path2class ".
Возможно, что-то не так в процессе упаковки как психолога, так и Ruby.
Ответ 4
У меня была такая же проблема, и я вспомнил, что недавно был обновлен XCode. Мне напомнили об этом, потому что в некоторых выводах на терминале утверждалось, что инструменты разработчика не установлены и предлагается запустить следующее:
$ xcode-select --install
Он по-прежнему не работал, поэтому я использовал rvm для установки последней версии Ruby версии 2.1, создал новый gemset, указал мое приложение, чтобы использовать этот gemset и запустил $ bundle install
. Теперь он работает.
Ответ 5
Для меня это оказалось проблемой с разрешениями. Я исправил его, сбросив мои разрешения в моей папке ~/.rvm
. Mac OS X 10.9.3.
Сначала найдите свое имя пользователя системы:
ls -lA ~ | head
Выдает:
[email protected] 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
И больше никаких ошибок.
Ответ 6
Это не очень проницательный ответ, но в моем случае проблема исчезла, переключившись на ruby-2.1.2
(p95, кстати) через rvm
.
Я все равно собирался обновляться...