開発をしていると、いろんなプロジェクトでbundle install
やbundle update
したり、直接gem install
したりで、実に様々なバージョンのgemが入って、そのせいでコンフリクトが起こったりします。その時に、そのエラーを直すにはどうすればいいか実例で説明します。
今回はtd
が動かなくなった例で説明するし、自分はMacでawakia
というユーザー名で、rubyの1.9.3-p194
を使い、rvm
じゃなくてrbenv
をバージョン管理に使っているなど、細かい設定の違いはあると思いますが適宜自分の環境置き換えて読んでみてください。
$ td tables
/Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/specification.rb:1625:in `raise_if_conflicts': can't activate td-client-0.8.25, already activated td-client-0.8.39 (Gem::LoadError)
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/specification.rb:746:in `activate'
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/custom_require.rb:51:in `block in require'
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/custom_require.rb:50:in `each'
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/custom_require.rb:50:in `require'
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/td-client-0.8.39/lib/td/client/api.rb:20:in `initialize'
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/td-client-0.8.39/lib/td/client.rb:21:in `new'
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/td-client-0.8.39/lib/td/client.rb:21:in `initialize'
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/td-0.10.64/lib/td/command/common.rb:23:in `new'
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/td-0.10.64/lib/td/command/common.rb:23:in `get_client'
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/td-0.10.64/lib/td/command/table.rb:195:in `table_tail'
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/td-0.10.64/lib/td/command/list.rb:161:in `call'
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/td-0.10.64/lib/td/command/list.rb:161:in `block in get_method'
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/td-0.10.64/lib/td/command/runner.rb:122:in `call'
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/td-0.10.64/lib/td/command/runner.rb:122:in `run'
from /Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/td-0.10.64/bin/td:9:in `<top (required)>'
from /Users/awakia/.rbenv/versions/1.9.3-p194/bin/td:23:in `load'
from /Users/awakia/.rbenv/versions/1.9.3-p194/bin/td:23:in `<main>'
というようになった場合の対処です。
一つの方法は、頭にbundle exec
を付ければ良いです。
$ bundle exec td tables
ただ、bundle exec
なしでも動かしたいですよね。
今回の場合、調べてみるとtd-0.10.64
のtd-client
のバージョン指定が~> 0.8.39
となっていて、それをrequireした後、custom_require.rb
が過去のバージョンのものまでrequireしていたのでコンフリクトしているようだということがわかりました。
過去インストールしたバージョンのgemはすべて以下のディレクトリに入っています。
/Users/awakia/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/specifications
この中に td-client-0.8.24.gemspec
があったので、これを消してみます。
そうすると、今度は td-client-0.8.25.gemspec
があって入らないみたいなエラーに変わりました。
ここまでで、この調子でどんどん以前のバージョンを消していけばよさそうということはわかりました。
過去のバージョンを一個一個手で消してもいいんだけど、めんどくさいなぁと思っていたら、ちょうどいいコマンドがありました。
gem cleanup
これは、古いバージョンのgemだけを削除するコマンドで、正式には以下のように書かれています。
Clean up old versions of installed gems in the local repository
ちなみに、ある環境は古いのを使っていた場合に、消しすぎちゃう場合があるんじゃないかという心配もあるけれど、結局動かなくなってもbundle install
,gem install
すれば、またそれはインストールされるので気にせずcleanupしちゃえばいいのではないかと思います。