From: Yusuke ENDOH Date: 2010-03-07T22:48:55+09:00 Subject: [ruby-dev:40577] Re: [Bug #2581] require_relative depends on current directory 遠藤です。 2010年3月7日22:26 Tanaka Akira : > まぁ直すのは名前以外難しくはなくて、 > *snip* > > とかですかね。 ああなるほど、これだけでいいんですね。 rb_iseq_t に絶対パスを載せなきゃならんと思い込んでました。 > Dir::INITIAL_WORKING_DIRECTORY というのが定義されるので、 > この名前が気に入らない人が出てくると難しいところですが。 私は構わないと思いますが、どうでしょうね。 define_method を使ってよければ、余分な定数もなしで済む気もします。 diff --git a/prelude.rb b/prelude.rb index 679e831..4aecf27 100644 --- a/prelude.rb +++ b/prelude.rb @@ -25,14 +25,20 @@ end module Kernel module_function - def require_relative(relative_feature) + initial_wd = + begin + Dir.getwd + rescue Exception + nil + end + define_method(:require_relative) do |relative_feature| c = caller.first e = c.rindex(/:\d+:in /) file = $` 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, initial_wd)), relative_feature) require absolute_feature end end 試していたら、以下のようにはまりました。 $ ./ruby -e 'require_relative "lib/cgi"' :35:in `realpath': No such file or directory - /home/mame/work/ruby/-e (Errno::ENOENT) from :35:in `require_relative' from -e:1:in `
' うーん、これはしょうがないか。 -- Yusuke ENDOH