2012年11月6日火曜日

Refinery CMSでデバッグしようとするとエラーになる

Refinery CMS 2.0.8で新しくプロジェクトを作ったあと、debuggerを使ってデバッグをしようとすると、エラーになってしまうことがあります。この投稿では、その問題の解決方法を紹介します。

環境

  • Ubutnu 12.04
  • ruby 1.9.3p0 (2011-10-30 revision 33570) [i686-linux]
  • refinerycms 2.0.8
  • bundler 1.2.1
  • debugger 1.2.1

問題

$ refinerycms sample

を実行して新しいプロジェクトを作成し、

$ cd sample

Gemfileを次のように編集し、

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger
gem 'debugger'  # <=ここをコメントアウト

# Refinery CMS
gem 'refinerycms', '~> 2.0.0'

いつものように

$ bundle install

すると、次のようなエラーが出てしまいます。

$ rails s
/home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/debugger-1.2.1/lib/ruby-debug/interface.rb:55:in `block (2 levels) in initialize': uninitialized constant Debugger::LocalInterface::Readline (NameError)
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/debugger-1.2.1/lib/ruby-debug/interface.rb:53:in `each'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/debugger-1.2.1/lib/ruby-debug/interface.rb:53:in `block in initialize'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/debugger-1.2.1/lib/ruby-debug/interface.rb:52:in `open'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/debugger-1.2.1/lib/ruby-debug/interface.rb:52:in `initialize'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/debugger-1.2.1/lib/ruby-debug/processor.rb:61:in `new'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/debugger-1.2.1/lib/ruby-debug/processor.rb:61:in `initialize'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/debugger-1.2.1/lib/ruby-debug.rb:9:in `new'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/debugger-1.2.1/lib/ruby-debug.rb:9:in `<module:Debugger>'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/debugger-1.2.1/lib/ruby-debug.rb:8:in `<top (required)>'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/debugger-1.2.1/lib/debugger.rb:4:in `require'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/debugger-1.2.1/lib/debugger.rb:4:in `<top (required)>'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/bundler-1.2.1/lib/bundler/runtime.rb:68:in `require'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/bundler-1.2.1/lib/bundler/runtime.rb:68:in `block (2 levels) in require'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/bundler-1.2.1/lib/bundler/runtime.rb:66:in `each'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/bundler-1.2.1/lib/bundler/runtime.rb:66:in `block in require'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/bundler-1.2.1/lib/bundler/runtime.rb:55:in `each'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/bundler-1.2.1/lib/bundler/runtime.rb:55:in `require'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/bundler-1.2.1/lib/bundler.rb:128:in `require'
        from /srv/samba/share/sample/config/application.rb:13:in `<top (required)>'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.2.8/lib/rails/commands.rb:53:in `require'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.2.8/lib/rails/commands.rb:53:in `block in <top (required)>'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.2.8/lib/rails/commands.rb:50:in `tap'
        from /home/jharai/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.2.8/lib/rails/commands.rb:50:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'

このように、サーバが起動せずデバッグも行えません。

原因

この問題は、作成されたRailsアプリケーションがBundlerの管理下にあるため、readlineをロードできていないのが原因です。

詳細は、以前私が似たような問題に遭遇した際に投稿したissue "Could not find a JavaScript runtime." error during fresh installation に書かれています。

解決方法

次のようにGemfileに一行加えて、Bundlerにreadlineを使うことを伝えます。

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger
gem 'debugger'
gem 'rb-readline' # <=加える

# Refinery CMS
gem 'refinerycms', '~> 2.0.0'

これで、

$ bundle install

すると、サーバが起動してデバッグも行えるようになります。

$ rails s
=> Booting WEBrick
=> Rails 3.2.8 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[1, 10] in /srv/samba/share/sample/config/environment.rb
   1  # Load the rails application
   2  require File.expand_path('../application', __FILE__)
   3
   4  debugger
   5  # Initialize the rails application
=> 6  Sample::Application.initialize!
/srv/samba/share/sample/config/environment.rb:6
Sample::Application.initialize!
(rdb:1) 

ちなみに、Refinery CMS 1で開発していたときは、この問題は起こりませんでした。原因はよく分かりません・・・。

関連