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

  • 14
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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

  • この記事は以下の記事からリンクされています
  • RaspberryPiの事始めからリンク