如何从Ruby中的特定相对路径加载文件?

Joh*_*lla 5 ruby ruby-1.9

我正在制作内部使用的宝石.在其中,我从另一个目录加载一些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
Run Code Online (Sandbox Code Playgroud)

我宁愿不依赖于data/root.yaml相对的位置initializer.rb.相反,我宁愿得到一个参考<project_root>并依赖于那里的相对路径,这似乎是一个更聪明的举动.

首先,这是最好的方法吗?其次,如果是这样,我该怎么做?我检查了各种File方法,但我不认为有类似的东西.我正在使用Ruby 1.9.

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

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

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

The*_*heo 4

如果您始终运行一个主文件,则可以使用该文件作为参考点。该文件的相对路径(当前目录和之间)将位于 中$0,因此要获取相对路径data/root.yaml(假设这是主文件和 之间的相对路径root.yaml),您需要执行以下操作

path_to_root_yaml = File.dirname($0) + '/data/root.yaml'
Run Code Online (Sandbox Code Playgroud)