ruby 中的require
方法将搜索 lib_path 并在需要时加载找到的第一个匹配文件。无论如何要打印要加载的文件的路径。我正在寻找理想的内置功能,类似于which
bash 中的命令,并希望它也可以那么简单。谢谢。
问问题
204 次
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 回答