【Rails】依存関係にあるGemのバージョンコンフリクト「Bundler could not find compatible versions」


概要

依存関係にあるgemのバージョン問題を解決する。
今回は以下2点のgemにおいて発生したエラーの解決までの流れになります。

omniauth-google-oauth2
https://github.com/zquestz/omniauth-google-oauth2

rspotify
https://github.com/guilhermesad/rspotify

エラー発生

omniauth-google-oauth2を利用してGoogleSNS認証を実装し、
ログインが完了した後にアプリ内のとあるviewで以下のエラーが発生するようになってしまいました。

エラーメッセージ「key not found: :ciphers」


  require 'rspotify'
  RSpotify.authenticate(ENV['SPOTIFY_CLIENT_ID'], ENV['SPOTIFY_SECRET_ID'])

SpotifyAPIを利用するために取得していたkeyが見つからないとのこと。
Google認証機能を加える前は問題なくAPI連携できていました。
行ったことはGoogle認証機能を実装するために、’omniauth-google-oauth2’を最新バージョンにアップデートしたことでした。

SpotifyAPIの連携には’rspotify’というラッパーを使っています。
Gemfile.lockを確認するとrspotifyのバージョンが変わってしまっていることがわかりました。

【omniauthバージョンアップ前】

Gemfile.lock
omniauth-google-oauth2 (0.2.6)
      omniauth (> 1.0)
      omniauth-oauth2 (~> 1.1)

rspotify (2.4.0)
      omniauth-oauth2 (~> 1.3.1)
      rest-client (~> 2.0.2)

【omniauthをバージョンアップした後】

Gemfile.lock
omniauth-google-oauth2 (0.8.0)
      jwt (>= 2.0)
      omniauth (>= 1.1.1)
      omniauth-oauth2 (>= 1.6)

    rspotify (1.15.4)
      omniauth-oauth2 (~> 1.1)
      rest-client (~> 1.7)


Gemfile内の記号の意味

例えばomniauth-oauth2 (~> 1.3.1)であれば、
~>は上記を例にすると1.3.1以上1.4.0未満のバージョンを指定することになる。
>は指定バージョンより大きいバージョンを。
>=は指定バージョン以上のバージョンをインストールします。

原因解明

原因は’rspotify’と’omniauth-google-oauth2’の両方に依存関係があるgem’omniauth-oauth2’でした。
omniauth-google-omniauth2の最新バージョンをインストールすると、依存関係にあるomniauth-oauth2>=1.6となっています。

rspotifyのバージョンを戻すため、バージョン指定でinstallしてみました。
gem 'rspotify', '>= 2.4.0'



すると、


Bundler could not find compatible versions for gem "omniauth-oauth2":
  In snapshot (Gemfile.lock):
    omniauth-oauth2 (= 1.6.0)

  In Gemfile:
    omniauth-google-oauth2 was resolved to 0.8.0, which depends on
      omniauth-oauth2 (>= 1.6)

    rspotify (>= 2.4.0) was resolved to 2.4.0, which depends on
      omniauth-oauth2 (~> 1.3.1)

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.

このエラーコードを読み解くと、’omniauth-google-oauth2’のバージョン’0.8.0’に対して依存するomniauth-oauth21.6.0以上が指定されると、

rspotifyのバージョン2.4.0に対して依存するomniauth-oauth2’~> 1.3.1’つまり1.3.1以上1.4.0未満が指定される。
だからバージョンのコンフリクトが起きて、インストールできないと。

rspotify (1.15.4)
omniauth-oauth2 (~> 1.1)が依存関係で指定されるので、バージョンは1.1以上2.0未満という指定です。
そのためomniauth-oauth2(>= 1.6.0)とも共存できるという認識をしました。
間違ってるかも・・・

解決方法

エラーメッセージの通りにbundle updateをしてみてもrspotifyのバージョンは変わりませんでした。

依存関係にあるgemのバージョンを確認する。

'omniauth-oauth2'のバージョンコンフリクトを解消するために'rspotify'’omniauth-google-oauth2’のgithubを確認。

githubのBranch:masterをクリックして、
Tagsを選択すれば、様々なバージョンごとにソースコードが分かれています。


ここで最新のv0.8.0では依存関係のある'omniauth-oauth2'

omniauth-google-oauth2.gemspec
gem.add_runtime_dependency 'omniauth-oauth2', '>= 1.6'

とバージョン1.6以上が指定されています。

v0.7.0を指定して見てみると、

omniauth-google-oauth2.gemspec
gem.add_runtime_dependency 'omniauth-oauth2', '>= 1.5'

バージョンは1.5以上になってます。


'rspotify'でも同じように'omniauth-oauth2’のバージョン指定を確認していきました。
最新のv2.8.0で見てみると、

rspotify.gemspec
spec.add_dependency 'omniauth-oauth2', '~> 1.5.0'

バージョン指定は1.5.0以上1.6.0未満となってます。

つまり、v0.7.0v2.8.0でインストール指定すればコンフリクトが解消され、rspotifyが最新バージョンになるのでkey取得の問題も解消されるのではないかと!

tag指定でgemをインストールする

Gemfileにtag指定でインストールするように記載します。


gem 'omniauth-google-oauth2', git: "[email protected]:zquestz/omniauth-google-oauth2.git", tag: "v0.7.0"

gem 'rspotify', git: "[email protected]:guilhermesad/rspotify.git", tag: "v2.8.0"

一度Gemfile.lockを消して、bundle installすれば、コンフリクトなくバージョン指定することができ、エラーも解消されました!

普通はbundlerが勝手にコンフリクトのないようにバージョンをインストールしてくれるみたいですが、
今回はうまくできなかったので、自分で指定してからインストールすることになりました。