require と require_relative

Rubyの話。

これまで
require で相対パスを指定することで別ファイルのRuby スクリプトを読み込んでいた。

発生した問題
あるスクリプトを実行したら、別のディレクトリにあるRuby スクリプトに対してloadError が発生した。

エラーメッセージ
D:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/[ファイル名].rb:[行番号]:in `require': cannot load such file -- ./[Ruby スクリプト] (LoadError)

原因

parent/scrA.rb
parent/child1/scrB.rb
parent/child2/scrC.rb

が存在するとき。

# scrB.rb
require '../scrA'

でscrB はscrA.rb を読み込んでいる。

# scrA.rb
require './child2/scrC'

でscrA はscrC.rb を読み込んでいる。

この時、scrB.rbを実行すると、カレントディレクトリはchild1 であるので、./child2/scrC.rb は見つからない。

解決法
require_relative を使う。
require_relative は、呼び出したスクリプトの存在するディレクトリから相対パスを辿る。

# scrA.rb
require_relative './child2/scrC'

とすればいい。
しかし、どこから参照されるか分からないスクリプトは基本的にrequire_relative を使ったほうがいいと思われる。