【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」

```ruby

  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)
```

<br>
##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'

<br>
すると、

```terminal

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-oauth2`は`1.6.0`以上が指定されると、

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

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

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


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

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

githubのBranch:masterをクリックして、
Tagsを選択すれば、様々なバージョンごとにソースコードが分かれています。
<br>
ここで最新の`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以上になってます。

<br>

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

```rspotify.gemspec
spec.add_dependency 'omniauth-oauth2', '~> 1.5.0'
```
バージョン指定は1.5.0以上1.6.0未満となってます。

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

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

```ruby

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