是否有可能在Ruby中获取需要另一个文件的文件的位置?
我有一个项目,我生成一些进程,我希望能够在代码中确定哪个文件是所需文件的父文件。调试时这很好。
示例:
#initial.rb:
require "./my_file.rb"
fork do
require "./my_file2.rb"
end
-
#my_file.rb:
puts "Required from file: #{?????}"
-
#my_file2.rb:
require "./my_file.rb"
我希望得到类似的东西:
#=> Required from file: /path/to/initial.rb
#=> Required from file: /path/to/my_file2.rb
答案 0 :(得分:2)
基于Jacobs answer我最后重新定义了require_relative
和require
:
alias :old_require_relative :require_relative
def require_relative(arg)
#~ puts caller.map{|x| "\t#{x}"}
puts "%s requires %s" % [ caller.first.split(/:\d+/,2).first, arg]
old_require_relative arg
end
alias :old_require :require
def require(arg)
#~ puts caller.map{|x| "\t#{x}"}
puts "%s requires %s" % [ caller.first.split(/:\d+/,2).first, arg]
old_require arg
end
在具有以下加载顺序的测试测试场景中:
test.rb
+- test1.rb
+- test1_a.rb
+ test2.rb
以下电话
require './test1'
require './test2'
或
require_relative 'test1'
require_relative 'test2'
结果:
test.rb requires ./test1
C:/Temp/test1.rb requires test1_a
test.rb requires ./test2
您还可以在输出中包含需求行。
答案 1 :(得分:1)
您永远不需要这样做,但您可以从Kernel#caller
检查调用堆栈。您必须过滤掉require方法(特别是如果您使用任何覆盖require的库)。