获取父需要文件的路径,Ruby

时间:2014-04-22 12:51:05

标签: ruby directory require

是否有可能在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

2 个答案:

答案 0 :(得分:2)

基于Jacobs answer我最后重新定义了require_relativerequire

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的库)。