こんにちわ、cloudpack廣山豊です。

古い環境(ruby1.8.7, rails2.3.10)に、deviseをインストールする際に手こずったのでメモ。
少し長くなるが、いつか誰かの類件の問題解決につながればと、紆余曲折も含め記載しておく。

奮闘記

以前に別のサーバーで動いていたRailsアプリケーションをポーティング。
新規にサーバーを立ち上げ、rubyやrailsをインストールしたり、いろいろごにょごにょ初期設定を済ませ、いざ起動!

失敗。。。(´・ω・`)

[root@host hoge]# ruby ./script/server
=> Booting WEBrick
=> Rails 2.3.10 application starting on http://0.0.0.0:3000
Missing these required gems:
  warden
  devise

You're running:
  ruby 1.8.7.375 at /root/.rbenv/versions/1.8.7-p375/bin/ruby
  rubygems 1.6.2 at /root/.gem/ruby/1.8, /root/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8

Run `rake gems:install` to install the missing gems.

まぁ、そんなにすんなり行くはずもない。
言われた通り、rake gems:installしてみる。

[root@host hoge]# rake gems:install
(in /.../hoge)
gem install warden
Successfully installed warden-1.2.3
1 gem installed
Installing ri documentation for warden-1.2.3...
Installing RDoc documentation for warden-1.2.3...
gem install devise
ERROR:  Error installing devise:
    activesupport requires Ruby version >= 1.9.3.
Building native extensions.  This could take a while...
Building native extensions.  This could take a while...

なにやら、「devise」のインストールには失敗している。
rubyのバージョンを1.9.3.以上にとのこと。
それはできない相談である。

そもそも、rake gem:installでインストールした、「warden」や「devise」はどこで指定されたのか???

コードを探ってみたところ、config.enviroment.rbに怪しい記述が。

config.enviroment.rb

  # Devise用
  config.gem 'warden'
  config.gem 'devise'

バージョンの定義がないことを見ると、最新バージョンを取得しようとしたんだろう。
調べてみたところ、gem install同様バージョン指定もできそうだ。
前に動いていたサーバーにインストールされていたdeviceのバージョンを調べて指定する。

config.enviroment.rb

  # Devise用
  config.gem 'warden'
  config.gem 'devise', :version => '1.0.10'

もう一度、インストール。

[root@host hoge]# rake gems:install
(in /.../hoge)
gem install devise --version "= 1.0.10"
Successfully installed warden-0.10.7
Successfully installed devise-1.0.10
2 gems installed
Installing ri documentation for warden-0.10.7...
Installing ri documentation for devise-1.0.10...
Installing RDoc documentation for warden-0.10.7...
Installing RDoc documentation for devise-1.0.10...

うまくいったようだヽ(・∀・)ノ
いざ、再チャレンジ!

[root@host hoge]# ruby ./script/server
=> Booting WEBrick
=> Rails 2.3.10 application starting on http://0.0.0.0:3000
Missing these required gems:
  devise  = 1.0.10

You're running:
  ruby 1.8.7.375 at /root/.rbenv/versions/1.8.7-p375/bin/ruby
  rubygems 1.6.2 at /root/.gem/ruby/1.8, /root/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8

Run `rake gems:install` to install the missing gems.

。。。( ´ Д ` ;)

deviseなら、さきほどインストールしたではないか!?
インストール時にエラーや警告は出なかった。
gem listにもしっかり存在している。

いろいろ調べたところ、rake gemsでは、未インストールのままだ。

[root@host hoge]# rake gems
(in /.../hoge)
 - [I] warden
    - [R] rack >= 1.0
 - [ ] devise = 1.0.10
 

ここで、ハマる。
手動でgemコマンドで再インストールしてみたり、rakeが参照しているgemがおかしいのか疑って調べたり、狂ったようにひたすらインストールを繰り返したり。。。

そして、ダメ元でdeviseのバージョンをruby1.8.7の対応する範囲内で適当に上げてみることにする。
とりあえず、devise2.2.8.でrake gems:install

相変わらず、サーバーは起動できないものの、エラーメッセージに変化が!
rake gemsの表示も変わってる。

[root@host hoge]# rake gems
(in /.../hoge)
 - [I] warden
    - [R] rack >= 1.0
 - [I] devise = 2.2.8
    - [I] warden ~> 1.2.1
       - [R] rack >= 1.0
    - [I] orm_adapter ~> 0.1
    - [I] bcrypt-ruby ~> 3.0
       - [I] bcrypt >= 3.1.3
    - [ ] railties ~> 3.1

「warden」が「devise」の入れ子でも表示されている。
あらためて、「devise」について調べてみると、どうやら「devise」は「warden」をベースにしているらしい。

依存関係がある「warden」を、先にバージョン未指定(=最新バージョン)でインストールしていた。
そのため、「devise」インストール時に、非対応の「warden」を参照してしまい、インストールに失敗していたのではなかろうか。
入れ子に表示されているのは、依存関係のあるモジュール群ってことか。
見落としていたが、rake gems:installで「devise」をインストールした際、対応する「warden」もしっかりインストールしている。

[root@host hoge]# rake gems:install
(in /.../hoge)
gem install devise --version "= 1.0.10"
Successfully installed warden-0.10.7
  コレ (・_・)↑ 
Successfully installed devise-1.0.10
2 gems installed

ただし、競合処理がうまくいかず、最終的に失敗していたのだろう。

頭の中でいろいろ整理がついたので、いじくる前の環境からリスタート!
この辺りが仮想環境(今回はAWS)の恩恵だ。

今度は、「warden」のバージョンもしっかり指定。

config.enviroment.rb

  # Devise用
  config.gem 'warden', :version => '0.10.7'
  config.gem 'devise', :version => '1.0.10'
[root@host hoge]# rake gems:install
...

[root@host hoge]# rake gems
 - [I] warden = 0.10.7
    - [R] rack >= 1.0.0
 - [I] devise = 1.0.10
    - [I] warden ~> 0.10.3
       - [R] rack >= 1.0.0

O.K!!

いよいよ、サーバー再起動。。。

[root@host hoge]# ruby ./script/server
=> Booting WEBrick
=> Rails 2.3.10 application starting on http://0.0.0.0:3000

エラーもなく、無事起動(´∀`)ノ
長かった。。。

まとめ

  • railsアプリケーション内で使用するモジュールを、”config.enviroment.rb”で定義できる。
  • “config.enviroment.rb”では、バージョンも指定可能。
  • gem listだけでなく、rake gemsでも確認する
  • rake gemsでは入れ子形式で、依存するモジュールを表示している
  • gemの依存関係にはくれぐれも注意!

元記事は、こちらです。
deviseをruby1.9.3より古い環境にインストールする