【问题标题】:Ruby require pathRuby 需要路径
【发布时间】:2011-04-05 09:29:47
【问题描述】:

我在几个文件中有一个包含不同类的 Ruby 代码。在一个文件中,我开始执行。这个文件requires 我的其他文件。

  • 这是启动 ruby​​ 代码的好方法吗?
  • 当我从符号链接运行代码时,例如DIR2/MyRubyCode 是指向主文件DIR1/MyRubyCode.rb 的链接,那么我的要求将失败。我通过在require 之前添加路径DIR1$LOAD_PATH 解决了这个问题,但我认为会有更好的方法来做到这一点。您对此有什么建议吗?

【问题讨论】:

    标签: ruby require


    【解决方案1】:

    如果您想检查 Ruby 文件是否正在被“require”编辑或使用“ruby MyRubyCode.rb”执行,请检查__FILE__ 常量。

    # If the first argument to `ruby` is this file.
    if $0 == __FILE__
      # Execute some stuff.
    end
    

    就 require/$LOAD_PATH 问题而言,您始终可以在 require 语句中使用相对路径。例如:

    # MyRubyCode.rb
    require "#{File.dirname(__FILE__)}/foo_class"
    require "#{File.dirname(__FILE__)}/bar_module"
    

    这将包括与MyRubyCode.rb 位于同一目录中的foo_class.rbbar_module.rb 文件。

    【讨论】:

    • 谢谢,但如果我需要 File.dirname(FILE),当我使用别名启动代码时,它也会尝试从“.”中包含我仍然有“没有要加载的文件”错误。
    • 没错。您必须获得符号链接的目标(它将代替File.dirname())。查看这篇文章,了解几种不同的方法:stackoverflow.com/questions/1237939/…
    • 谢谢。它适用于 $LOAD_PATH << File.dirname(Pathname.new(File.expand_path(__FILE__)).realpath.to_s).to_s
    • 对我来说,它只能在没有字符串插值的情况下工作:require File.dirname(__FILE__) + "/foo_class"
    • 改用require_relative
    【解决方案2】:

    我知道这是一个老问题,但有一个更新的答案,我想发布它:

    从较新版本的 Ruby 开始(我不确定何时),您可以使用以下命令要求同一目录中的文件:

    require './foo_class'
    require './bar_module'
    

    它会在同一目录中加载名为foo_class.rbbar_module.rb 的文件。

    要检查您的文件是required 还是正常运行,请检查其他答案。

    【讨论】:

    • 此答案未解决原始问题中的用例,因为如果从符号链接调用 ruby​​ 文件或位于用户路径上,它仍然会失败。
    【解决方案3】:

    如果您使用的是 Ruby 1.9 或更高版本,请使用 require_relative 作为您的依赖项。

    require_relative 'foo_class'
    require_relative 'bar_module'
    

    【讨论】:

      猜你喜欢
      • 2014-06-06
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 2013-10-20
      • 2015-02-23
      • 2012-12-03
      相关资源
      最近更新 更多