【问题标题】:How do I load files from a specific relative path in Ruby?如何从 Ruby 中的特定相对路径加载文件?
【发布时间】:2010-06-19 14:42:04
【问题描述】:

我正在制作一个供内部使用的宝石。在其中,我从另一个目录加载了一些 YAML:

# in <project_root>/bin/magicwand
MagicWand::Configuration::Initializer.new(...)

# in <project_root>/lib/magicwand/configuration/initializer.rb
root_yaml = YAML.load_file(
  File.expand_path("../../../../data/#{RootFileName}", __FILE__))

# in <project_root>/data/root.yaml
---
apple:   100
banana:  200
coconut: 300

我宁愿不依赖data/root.yaml 相对于initializer.rb 的位置。相反,我宁愿参考 &lt;project_root&gt; 并依赖从那里的相对路径,这似乎是一个更明智的举措。

首先,这是解决此问题的最佳方法吗?其次,如果是这样,我该怎么做?我检查了各种File 方法,但我认为没有类似的东西。我正在使用 Ruby 1.9。

现在,我创建了一个特殊的常量并依赖它:

# in lib/magicwand/magicwand.rb
module MagicWand
  # Project root directory.
  ROOT = File.expand_path("../..", __FILE__)
end

但我也不确定我是否喜欢这种方法。

【问题讨论】:

    标签: ruby ruby-1.9


    【解决方案1】:

    如果有一个您始终运行的主文件,您可以将该文件用作参考点。该文件的相对路径(当前目录和)将在$0 中,因此要获得data/root.yaml 的相对路径(假设这是主文件和root.yaml 之间的相对路径),您可以这样做

    path_to_root_yaml = File.dirname($0) + '/data/root.yaml'
    

    【讨论】:

    • 这是个好主意,但它会在测试期间中断,因为我经常直接对类进行单元测试,而不是启动整个应用程序堆栈。在这种情况下,我的 $0 会有所不同(测试运行程序的路径,而不是我的应用程序)。
    • 将查找包装在一个简单的对象中,您可以在测试期间将其存根。
    猜你喜欢
    • 2016-04-23
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多