Обнаружьте, что метод ruby ​​require файла загружает?

Метод require в ruby ​​будет искать lib_path и при необходимости загружать первые найденные подходящие файлы. Есть ли способ напечатать путь к файлу, который будет загружен. Я ищу, в идеале, встроенную функциональность, аналогичную команде which в bash, и надеюсь, что она может быть такой же простой. Спасибо.


person Blake Taylor    schedule 31.07.2010    source источник


Ответы (2)


Я не знаю встроенной функциональности, но определить свою собственную несложно. Вот решение, адаптированное из этот вопрос< /а>:

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  
person michaelmichael    schedule 31.07.2010
comment
Спасибо. У меня было ощущение, что мне нужно будет создать свою собственную реализацию. Кстати, похоже, это работает только с ruby ​​​​1.9, потому что 1.8 не включает пути отдельных драгоценных камней явно в $ :. - person Blake Taylor; 02.08.2010

$ gem, какое имя файла # (без суффикса .rb) я использую...

person rogerdpack    schedule 01.08.2010