From: KOSAKI Motohiro Date: 2010-03-07T02:51:49+09:00 Subject: [ruby-dev:40570] Re: [Bug:trunk] require_relative depends on current directory > なぜか、chdir後のrequire_relativeの中で間違ったディレクトリでt1.rbを開こうとするようです。 答えは全部ソースにありました ←あたりまえですが 26: module Kernel 27: module_function 28: def require_relative(relative_feature) 29: c = caller.first 30: e = c.rindex(/:\d+:in /) 31: file = $` 32: if /\A\((.*)\)/ =~ file # eval, etc. 33: raise LoadError, "require_relative is called in #{$1}" 34: end 35: absolute_feature = File.join(File.dirname(File.realpath(file)), relative_feature) 36: require absolute_feature 37: end 38: end 29行目でcallerを使って呼び出しもとファイル t1.rb を取得して、35行目でFile.realpath()を 使って絶対パスに変換しようとしていますが、chdirはこのアルゴリズムの穴をついてしまいます。 1.そもそもrealpath()はカレントパスを元に相対パスを絶対パスに補完する関数なので 使用者が期待している、スクリプトファイルからの相対位置ではない 2.File.realpath()は存在しないパスを引数に与えると例外投げる。よって、 キャッチしなければ、スクリプトが終了してしまう。 よく知らないのですが、内部的には二重require防止用に絶対パスでロード済みファイル情報 持っている気がするのでrequire_relativeを組み込みにすれば解決?