【Ruby on Rails】RSpec実行時にgemのバージョン違いで警告を受ける。


前書き・編集点

2020.10.10
コメントより修正を行いました。

環境

Ruby 2.5.7
Rails 5.2.4

gem

gem 'rspec-rails', '~> 3.6'

経緯

RSpecでテストコードを書いて、いざ実行すると、次のようなエラーが発生しました。

$ rspec spec/models/tag_spec.rb

WARN: Unresolved specs during Gem::Specification.reset:
      diff-lcs (< 2.0, >= 1.2.0)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.

正確にはエラーではなく、同じgemで複数のバージョンがあるからそれの警告を受けているようで、テスト自体は無事に実行されていました。
しかし、放っておくわけにも行かないので、解決していきます。

手順

解決策はこちらの記事を参考にさせていただきました。
Qiita - RubygemでWARN: Clearing out unresolved specs.が出た時の対応

まずは問題のgemについて確認していきます。

$ diff-lcs (< 2.0, >= 1.2.0)

diff-lcsというgemのバージョンが複数あるという指摘でしたが、このgemは自分でインストールした覚えはないので、当然ながらGemfileには記載がありません。
となると、何らかのgemをインストールした時にbundlerが依存gemとして自動的にインストールした可能性があるので、Gemfile.lockを確認すると、rspecのgemの依存以外のところにもdiff-lcs (1.4.4)がありました。

rspecでインストールされている依存gemは2箇所あって、どちらもdiff-lcs (>= 1.2.0, < 2.0)という感じで、バージョンは書かれていないので、このgemのバージョンを次のコマンドで調べていきます。

$ gem list -a | grep diff-lcs

diff-lcs (1.4.4, 1.4.2, 1.3)

調べた結果、どうやら(1.4.4, 1.4.2, 1.3)3つのバージョンがインストールされているようです。
依存していない方のdiff-lsc (1.4.4)がこの中で一番最新ということで、rspec依存の他二つをこのバージョンに合わせていきます。

ここで一つ注意ですが、bundlerで依存しているgemをインストールした場合、依存gemのバージョンを安易に変更してしまうと、依存関係にある他のgemに不具合が起きる可能性があります。
今回の場合だと、rspec依存のdiff-lcs (< 2.0, >= 1.2.0)はバージョンが「1.2.0以上、2.0未満」と書かれてあったので(今回の中で)最新の1.4.4ならバージョンアップしても問題ないという結論に至りました。

次に参考サイトにも書かれてあるコマンドを実行していきます。

$ gem cleanup

そして

$ bundle install

これで警告文が消えました。

手順(依存関係でgemが複数バージョン必要な場合)

こちらコメントより抜粋させていただきます。

$ bundle exec rspec (実行ファイル指定)

を行うと、bundlerがGemfileに記述されている依存関係を自動的に認識してくれます。

依存関係が複雑になって、どうしても複数バージョンが必要な時は、前述した最新バージョンにまとめることはできないので、この方法しかなくなります。

まとめ

私の場合は、これ以外にもう一つ警告文が出ていましたので、それについては次の記事をご覧いただければと思いますヽ(;▽;)ノ
Qiita - 【Ruby on Rails】RSpec実行時にgem 'chromedriver-helper'は非推奨ですよって警告を受ける。

質問や解釈の違い、記述方法に違和感ありましたら、コメント等でご指摘いただけると幸いです。

最後まで読んでいただきありがとうございました。

参考サイト

私のGitHubに実際に使っているファイルを公開しているのでそちらも参考にしていただければと思います!
GitHub - MasaoSasaki/matchi

その他
Qiita - RubygemでWARN: Clearing out unresolved specs.が出た時の対応
YoheiIsokawa - 【Rails】Gemfileのバージョン指定の書き方