deviseをruby1.9.3より古い環境にインストールする


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


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

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

```shell-session
[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`してみる。

```shell-session
[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'
```

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

```shell-session
[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...
```

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

```shell-session
[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`では、未インストールのままだ。

```shell-session
[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`の表示も変わってる。

```shell-session
[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」もしっかりインストールしている。

```shell-session
[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'
```

```shell-session
[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!!

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

```shell-session
[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の依存関係にはくれぐれも注意！