【问题标题】:Get path of parent requiring file, Ruby获取父需要文件的路径,Ruby
【发布时间】:2014-06-06 20:39:18
【问题描述】:

是否可以在 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..。阅读this。我现在不能测试,但试试puts "Required from file: #{$0}"
  • 您应该使用require_relative 而不是require "./my_file.rb"。无论解决方案是什么,它都应该适用于require_relative

标签: ruby directory require


【解决方案1】:

基于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

您还可以在输出中包含需求行。

【讨论】:

  • 我喜欢这种方法,但是正如我在@JacobLukas answer 中提到的那样,在涉及多个进程时会出现问题。我将不得不复制这几个地方。我还需要变量中的字符串可访问代码中的其他位置,但这很容易。
【解决方案2】:

您永远不需要这样做,但您可以检查来自Kernel#caller 的调用堆栈。您必须过滤掉 require 方法(特别是如果您使用任何覆盖 require 的库)。

【讨论】:

  • 你能解释一下为什么我永远不应该这样做吗?我想这不是一件常见的事情,但我在可能使用相同库的子进程中进行错误记录,我需要将它们彼此区分开来。我可以做 PID 的事情,但是记录哪些进程在哪里启动并将这些事情链接在一起只是为了弄清楚我的哪些子进程正在向某些库提供非法数据,这会使事情变得非常复杂。
  • 如果您使用logger 或类似的gem,您可以设置每个子进程的模式以包含唯一标识符。然后你的共享库可以def logger; Logging.logger[self]; endlogger.error('message') 等。或者你可以让你的共享库带一个参数或其他东西。
猜你喜欢
  • 2011-04-05
  • 2011-11-16
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
相关资源
最近更新 更多