rcmdnk's blog

Gem: The Definitive Visual Guide

Macでgemコマンドを使おうとしたらエラーが出て使えず、 問題のありそうなgemもそもそもgemが使えないのでアンインストールも出来ない様な状態になってたので それに対処した話し。

gemを使おうとするとエラーが出る

環境はHomebrewでrubyをインストールして バージョンは2.4.2な状態です。

$ which ruby
/usr/local/bin/ruby
$ ruby --version
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]
$ which gem
/usr/local/bin/gem

これでおもむろにgemを使おうとすると

$ gem
/usr/local/Cellar/ruby/2.4.2/lib/ruby/2.4.0/yaml.rb:5:in `<top (required)>':
It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.
/usr/local/Cellar/ruby/2.4.2/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': dlopen(/usr/local/gems/gems/psych-2.2.4/lib/psych.bundle, 9): Library not loaded: /usr/local/opt/ruby/lib/libruby.2.4.1.dylib (LoadError)
  Referenced from: /usr/local/gems/gems/psych-2.2.4/lib/psych.bundle
  Reason: image not found - /usr/local/gems/gems/psych-2.2.4/lib/psych.bundle
        from /usr/local/Cellar/ruby/2.4.2/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/gems/gems/psych-2.2.4/lib/psych.rb:8:in `<top (required)>'
        from /usr/local/Cellar/ruby/2.4.2/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/Cellar/ruby/2.4.2/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/Cellar/ruby/2.4.2/lib/ruby/2.4.0/yaml.rb:6:in `<top (required)>'
        from /usr/local/Cellar/ruby/2.4.2/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/Cellar/ruby/2.4.2/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/Cellar/ruby/2.4.2/lib/ruby/2.4.0/rubygems.rb:701:in `load_yaml'
        from /usr/local/Cellar/ruby/2.4.2/lib/ruby/2.4.0/rubygems/config_file.rb:340:in `load_file'
        from /usr/local/Cellar/ruby/2.4.2/lib/ruby/2.4.0/rubygems/config_file.rb:202:in `initialize'
        from /usr/local/Cellar/ruby/2.4.2/lib/ruby/2.4.0/rubygems/gem_runner.rb:75:in `new'
        from /usr/local/Cellar/ruby/2.4.2/lib/ruby/2.4.0/rubygems/gem_runner.rb:75:in `do_configuration'
        from /usr/local/Cellar/ruby/2.4.2/lib/ruby/2.4.0/rubygems/gem_runner.rb:40:in `run'
        from /usr/local/bin/gem:21:in `<main>'

こんな感じのエラーが出ます。 最初にlibyamlに関するwarningが出てますが、 これはHomebrewでインストール済みです。

とりあえずlibyamlreinstallしてさらにrubyreinstallしてみましたがこの辺は変わらず。

実際の問題はその下にあるpsychに関する部分です。 YAMLを扱うgemなのでlibyamlを使うのですが、 そもそもこのgemからlibyamlを呼ぶ際におかしなことになっている様です。

/usr/local/opt/ruby/lib/libruby.2.4.1.dylib を呼ぼうとしていますがこんなファイルはありません。(2.4.2がインストールされてるので。)

このgemに問題がありそうなのでgem uninstall psychしたいのですが、 そもそもgemコマンドを使おうとすると有無を言わさず上のエラーが出ます。

最近のアップデートで入ったのかやはり問題に会ってる人は居るようで HomebrewのIssueにこの問題の解決策がありました。

Run into error in latest Ruby 2.4.2 · Issue #18123 · Homebrew/homebrew-core

ここにもありますが問題はHomebrewではなくてこのgem(というよりrubygems)なので Homebrewを使って無くても同様の問題が起こる可能性があります。 もしくはMac以外でも?

解決方法

ともかくこのエラーをなんとかしてgemを使える様にする必要があるので、 以下の2つのファイルを削除します。

$ rm /usr/local/lib/ruby/gems/2.4.0/gems/psych-2.2.4/lib/psych.bundle
$ rm /usr/local/lib/ruby/gems/2.4.0/gems/extensions/x86_64-darwin-16/2.4.0/psych-2.2.4/psych.bundle

もしくはGEM_HOMEとかを/usr/local/gemsとかに設定していれば

$ rm $GEM_HOME/gems/psych-2.2.4/lib/psych.bundle
$ rm $GEM_HOME/gems/extensions/x86_64-darwin-16/2.4.0/psych-2.2.4/psych.bundle

いずれにしろこれらのファイルを消せば上のエラーが出なくなってgemコマンドが使える様になるはずです。

そうしたら

$ gem uninstall psych

として問題のパッケージを削除。

この後

$ gem install psych

として再インストールすると問題は起きなくなっています。

まとめ

上のIssueにもありますが問題はこのgem自体というよりも rubygemsのスクリプトの問題の様です。

Ruby 2.4.2は9月14日にリリースされたものなので そこからこの問題が起こっていますが、 rubygems.rb自体のアップデートは無く、 元々psychに関しての動作設定がおかしく、 Rubyのバージョンが2.4.1から2.4.2になった所で問題が起きた、ということみたいです。

それに関するIssuesみたいのはrubygemsには見当たりませんが、 結構多くの人に影響するかつ必ず起こりうる問題なので すぐに対処されるのでは、と思います。

Issues · rubygems/rubygems

ちょっと良く理解できてないので(そもそもrubygemsが悪いのかどうかも) Issueを作れませんが、 分かる人が居れば適宜適当な対処をしてもらえればと思います。

Sponsored Links
Sponsored Links

« GitHubでのLICENSE提示が大分便利になってる Vimのlightlineでのステータスライン表示の調整 »

}