古い環境(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より古い環境にインストールする」