LoginSignup
2
3

More than 3 years have passed since last update.

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

Posted at

概要

依存関係にある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: "git@github.com:zquestz/omniauth-google-oauth2.git", tag: "v0.7.0"

gem 'rspotify', git: "git@github.com:guilhermesad/rspotify.git", tag: "v2.8.0"

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

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

2
3
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
2
3