Подтвердить что ты не робот

Чистая установка 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 и переустановить, но ничего не помогает.

У других людей, похоже, есть одна и та же проблема, но никто, похоже, еще не получил ответа:

ИЗМЕНИТЬ

Смотрите также эти два:

4b9b3361

Ответ 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.

Я все равно собирался обновляться...