【问题标题】:Discover the file ruby require method would load?发现文件 ruby​​ require 方法会加载?
【发布时间】:2010-07-31 19:39:48
【问题描述】:

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

【问题讨论】:

    标签: ruby rubygems irb


    【解决方案1】:

    我不知道内置功能,但定义自己的功能并不难。这是改编自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  
    

    【讨论】:

    • 谢谢。我有一种感觉,我需要创建自己的实现。顺便说一句,这似乎只适用于 ruby​​ 1.9,因为 1.8 没有在 $: 中明确包含单独的 gem 路径。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-30
      • 2015-11-24
      • 2012-04-02
      • 2015-12-16
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多