Posted at

RubygemでWARN: Clearing out unresolved specs.が出た時の対応

More than 3 years have passed since last update.


このエラーって何?

「同一のgemが複数バージョンでインストールされていて、システムでどれを選ぶか決めきれないよ」という警告。


解決策

システムで決めきれるようにすれば良い

方法は2つ

1. 旧バージョンのgemを削除し、選択肢を1つにする

2. 具体的なバージョンを指定する

1はやや乱暴ですが、使えるのならこちらが良いと思います。

几帳面な方や1が(権限的に)使えない方は2を使いましょう。


1.旧バージョンのgemを削除し、選択肢を1つにする

gem cleanup

これだけで良いです。

場合によってはsudo gem cleanupかもしれません。


2.具体的なバージョンを指定する


  • 古いバージョンのgemを消すといろいろまずい


  • gem cleanupをするにはsudoを行う権限が必要なのに、システム上権限を持っていない(持てない)
    等の場合はこちらの方法にしましょう。


step1: 何がエラーになっているかを確認する

例えばgem cleanupをした際に権限が無いとこんなエラーが返ってきます。

$ gem cleanup

Cleaning up installed gems...
Attempting to uninstall json-1.7.7
Unable to uninstall json-1.7.7:
Gem::InstallError: json is not installed in GEM_HOME, try:
gem uninstall -i /opt/rh/ruby200/root/usr/share/gems json

で、ここでtryと言われているコードを実行しても権限なくてダメです。

(そもそもsudoを行う権限は持っていません)

$ gem uninstall -i /opt/rh/ruby200/root/usr/share/gems json

ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /opt/rh/ruby200/root/usr/share/gems directory.


step2: gemのバージョンを確認する

$ gem list -a | grep json。

json (1.8.3, 1.7.7)

新版の1.8.3と旧版の1.7.7が混在していることがわかります。

※gem cleanupではAttempting to uninstall json-1.7.7の記述があるため、この旧版の1.7.7を削除しようとしたようです。


step3: 新しいバージョンをgemファイルに追記する


Gemfile

gem 'json', '1.8.3'


これで解決!