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でインストール済みです。
とりあえずlibyaml
をreinstall
してさらにruby
もreinstall
してみましたがこの辺は変わらず。
実際の問題はその下にある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には見当たりませんが、 結構多くの人に影響するかつ必ず起こりうる問題なので すぐに対処されるのでは、と思います。
ちょっと良く理解できてないので(そもそもrubygemsが悪いのかどうかも) Issueを作れませんが、 分かる人が居れば適宜適当な対処をしてもらえればと思います。