Ruby
Rails

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

More than 3 years have passed since last update.

古い環境(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の依存関係にはくれぐれも注意!