From: Tanaka Akira Date: 2010-03-07T22:26:20+09:00 Subject: [ruby-dev:40576] Re: [Bug #2581] require_relative depends on current directory 2010年3月7日22:06 Yusuke ENDOH : > Ruby では、ファイル先頭でなく、コード中で必要になって始めて require を > 呼ぶというコードが結構あります。lib/ 以下にもたくさん見つかります。 > (標準添付ライブラリのコードは上記の条件にあわないから問題ないけれど) > > 同じノリで require_relative を使われることは想像に難くないです。 まぁ直すのは名前以外難しくはなくて、 % svn diff --diff-cmd diff -x '-u -p' Index: prelude.rb =================================================================== --- prelude.rb (revision 26840) +++ prelude.rb (working copy) @@ -23,6 +23,13 @@ class Thread end end +Dir::INITIAL_WORKING_DIRECTORY = + begin + Dir.getwd + rescue Errno::EACCES, Errno::ENOENT + nil + end + module Kernel module_function def require_relative(relative_feature) @@ -32,7 +39,7 @@ module Kernel if /\A\((.*)\)/ =~ file # eval, etc. raise LoadError, "require_relative is called in #{$1}" end - absolute_feature = File.join(File.dirname(File.realpath(file)), relative_feature) + absolute_feature = File.join(File.dirname(File.realpath(file, Dir::INITIAL_WORKING_DIRECTORY)), relative_feature) require absolute_feature end end とかですかね。 Dir::INITIAL_WORKING_DIRECTORY というのが定義されるので、 この名前が気に入らない人が出てくると難しいところですが。 -- [田中 哲][たなか あきら][Tanaka Akira]