古い環境(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
に怪しい記述が。
# Devise用
config.gem 'warden'
config.gem 'devise'
バージョンの定義がないことを見ると、最新バージョンを取得しようとしたんだろう。
調べてみたところ、gem install
同様バージョン指定もできそうだ。
前に動いていたサーバーにインストールされていたdeviceのバージョンを調べて指定する。
# 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」のバージョンもしっかり指定。
# 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の依存関係にはくれぐれも注意!