发现ruby require方法会加载的文件?

时间:2010-07-31 19:39:48

标签: ruby rubygems irb

ruby​​中的require方法将搜索lib_path并加载找到的第一个匹配文件(如果需要)。无论如何都要打印要加载的文件的路径。我正在寻找,理想的内置功能,类似于bash中的which命令,并希望它也可以这么简单。感谢。

2 个答案:

答案 0 :(得分:3)

我不知道内置功能,但定义自己的功能并不难。这是一个改编自this question的解决方案:

def which(string)
  $:.each do |p|
    if File.exist? File.join(p, string)
      puts File.join(p, string)
      break
    end
  end
end

which 'nokogiri'
#=> /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri

说明:$:是一个预定义的变量。这是一系列搜索文件的地方loadrequirewhich方法遍历每个路径,查找您调用它的文件。如果找到匹配项,则返回文件路径。

我假设你只想让输出显示required文件的完整文件路径,如which。如果您还想查看required文件将自行加载的文件,那么链接问题中的解决方案可能更合适:

module Kernel
  def require_and_print(string)
    $:.each do |p|
      if File.exist? File.join(p, string)
        puts File.join(p, string)
        break
      end
    end
    require_original(string)
  end

  alias_method :require_original, :require
  alias_method :require, :require_and_print

end

require 'nokogiri'
#=>  /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/rubygems-update-1.3.5/lib/rbconfig
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/pp
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/sax
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/node
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/xpath
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xslt
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/html
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/css
#    /opt/local/lib/ruby1.9/1.9.1/racc/parser.rb  

答案 1 :(得分:1)

$ gem which filename#(no .rb suffix)就是我用的......