QA@IT

gemで取得されるバージョンはどのように決まる?(devise)

3109 PV

お世話になります。
環境としては下記のPaaSです。

  • ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-linux]
  • Rails 4.0.0
  • RUBYGEMS VERSION: 2.0.3
    https://www.nitrous.io/

gemのdeviseの勉強をしていたのですが、Gemfileに

gem 'devise'

と追記し、bundleすると
devise 1.5.4がインストールされます。

しかし、プロンプトで

gem install devise

とすると、バージョン2.2.4がインストールされます。
1.5.4のバージョンおよびGemfile.lockを削除してbundleし直しても、1.5.4が選択されます。
deviseに限らず、バージョン指定しない場合にインストールされるバージョンはどのように決定されるのでしょうか?
最新のバージョンではないのでしょうか?

また、下記のコマンドを実行した際にはどのような実体のファイルが作成され、
設定が行われるのでしょうか?(見える範囲でのinitializersフォルダのdevise.rbなどは消したのですが、
クラスの情報などが残っていないかをどのように確認すればよいか気になるので)

rails g devise:install

以上、細々した内容ですがご教授のほどお願い致します。
(または、どのような情報を見ればよいか:参考記事など)

回答

Gemfileに

source 'https://rubygems.org'
gem 'devise'

とだけ書けば devise 2.2.4 がインストールされましたが、

source 'https://rubygems.org'
gem 'rails', '4.0.0'
gem 'devise'

だと devise 1.5.4 になりますね。

gemspecによると、devise 1.5.4 の依存は

  • warden ~> 1.1
  • orm_adapter ~> 0.0.3
  • bcrypt-ruby ~> 3.0

一方 devise 2.2.4 は

  • warden ~> 1.2.1
  • orm_adapter ~> 0.1
  • bcrypt-ruby ~> 3.0
  • railties ~> 3.1

です。

rails 4.0.0 では当然 railties も 4.0 を使います。しかしながら railties 4.0 は devise 2.2.4 で指定されている ~> 3.1 という制限(メジャーバージョン3固定、マイナーバージョンが1以上)を満たせません。このため、 devise 2.2.4 は使用を見送られることになります。

結果的に、古いながらそのような条件が指定されていない(今となっては指定が不十分と言える) 1.5.4 が 選ばれてしまった ということになるでしょう。

編集 履歴 (1)
  • ありがとうございます。依存関係についてイメージが掴めました。なぜ、そうなるかも理解することができました。詳細はご説明をありがとうございます! -
  • 最新バージョン(gemはまだない)はRails4対応になっているので、gem 'devise', github: 'plataformatec devise' を明示してみてはどうでしょう。
    https://github.com/plataformatec/devise/blob/master/devise.gemspec#L25
    -
  • 間違えた。 plataformatec と devise の間は / -
ウォッチ

この質問への回答やコメントをメールでお知らせします。