LoginSignup
16
14

More than 5 years have passed since last update.

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

Posted at

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

16
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
14