#概要
依存関係にある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バージョンアップ前】
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をバージョンアップした後】
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-oauth2
は1.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'
は
gem.add_runtime_dependency 'omniauth-oauth2', '>= 1.6'
とバージョン1.6以上が指定されています。
v0.7.0
を指定して見てみると、
gem.add_runtime_dependency 'omniauth-oauth2', '>= 1.5'
バージョンは1.5以上になってます。
'rspotify'
でも同じように'omniauth-oauth2’
のバージョン指定を確認していきました。
最新のv2.8.0
で見てみると、
spec.add_dependency 'omniauth-oauth2', '~> 1.5.0'
バージョン指定は1.5.0以上1.6.0未満となってます。
つまり、v0.7.0
とv2.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が勝手にコンフリクトのないようにバージョンをインストールしてくれるみたいですが、
今回はうまくできなかったので、自分で指定してからインストールすることになりました。