3

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

4

2 回答 2

3

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

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

解释:$:是一个预定义的变量。这是一系列可以搜索文件的地方,load或者require. 该which方法遍历每个路径以查找您调用它的文件。如果找到匹配项,则返回文件路径。

我假设您只希望输出是显示文件完整文件路径的单行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  
于 2010-07-31T22:36:58.590 回答
1

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

于 2010-08-01T02:24:12.100 回答