requireでエラーが出るとき

他の人が作ったオープンソースRailsアプリを動かそうとして「in 'gem_original_require'」や「in 'require'」関係のエラーがたくさん出ることがあります。そういうときはどうしたらいいでしょうか?

エラーの確認

「script/server」で WEBrickがエラーを吐いて立ち上がらない場合は大抵そうです。このままではどうしようもないので「irb」でワンステップずつ追っかけていくことにしますが、ほとんどの場合、このような簡単なエラーだと思います。(動かないものを公開してないでしょうから)

irb(main):002:0> load 'action_view.rb'
LoadError: no such file to load -- builder
        from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'
        from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
        from C:/www/rubyurl/vendor/rails/actionpack/lib/action_view/template_handlers/builder.rb:1
        from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:32:in `gem_original_require'
        from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:32:in `require'
        from C:/www/rubyurl/vendor/rails/actionpack/lib/action_view.rb:25
        from (irb):2:in `load'
        from (irb):2

メッセージを下から見てって、loadされた「action_view.rb」の25行目に requireがあって「builder.rb」を読もうとしてるんだけど、ファイルが見つからない(no such file to load)ということです。「custom_require.rb」は本筋とは関係ないので無視します。
エラー(LoadError: no such file to load)を見た瞬間に、grepで *.rbを「builder」で検索してしまった方が速いかもしれません。

対処

このように lib/vendor関係のファイルがないのは、動作環境にインストールされた actionpackやaction_controller、actionmailerなどのバージョンに依存するファイルがリポジトリ(配布物)に含まれていないためだと思われます。
ということで、足りないと言われたファイルを「C:\ruby\lib\ruby\gems\1.8\gems\」配下のそれぞれのライブラリのvendorフォルダから探し出して、アプリの「sampleapp\vendor\rails\」配下のしかるべき位置にコピーしてやればOKです。
※ バージョン違いのファイルをコピーしてしまうと別のエラーがじゃんじゃん出て、はまるので要注意。(activesupport-2.0.2配下をコピーしないといけないのに、activesupport-1.4.4配下をコピーしたとか)

備忘録

いつも忘れてしまうのでメモ。

  • requireは最初の1回しか loadしないので、irbでテストするときは load 'xxx.rb'を使うこと。
  • ロードパスは「$:」もしくは「$LOAD_PATH」で確認。pはいらない。

参考

こちら(→有効なWikiNameではありません - Code Reading Wiki)が参考になりました。