Rubyで`raise_if_conflicts`というエラーが出たら`gem cleanup`を試して見ればいいんじゃないかという話


開発をしていると、いろんなプロジェクトで`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しちゃえばいいのではないかと思います。