在开发gem时读取文件(在lib下)的最佳实践是什么?

Yua*_*Guo 1 ruby gem rubymine

在处理开发宝石的"路径"时,我经历了一些痛苦.这是文件夹结构

生产代码:

lib/gem_name/foo/templates/some_template.erb
lib/gem_name/foo/bar.rb
Run Code Online (Sandbox Code Playgroud)

测试代码:

test/gem_name/foo/bar_test.rb
Run Code Online (Sandbox Code Playgroud)

在bar.rb中,我通过以下方式阅读模板:

File.read("templates/some_template.erb") => Errno::ENOENT: No such file or directory
Run Code Online (Sandbox Code Playgroud)

当我在RubyMine中的bar_test.rb中运行单元测试时,它给出了错误:

Errno::ENOENT: No such file or directory - D:/.../test/gem_name/foo/templates/some_template.erb
Run Code Online (Sandbox Code Playgroud)

显然路径上的测试是错误的.

我的问题是,

  1. 如何处理这个问题?
  2. 在开发宝石时处理这种路径问题的最佳实践是什么?

编辑:
因为__FILE__只返回它所写文件的路径,所以我现在定义fname(参见@ ckruse的答案)就像我需要的每个文件中的函数一样.它有效,但不优雅.也许有人会在这方面找到比我更好的解决方案.如果是的话,请告诉我.:)

ckr*_*use 5

您始终可以引用当前文件的目录,File.dirname(__FILE__)然后使用相对路径,例如:

fname = File.dirname(__FILE__) + "/templates/some_template.rb"
File.read(fname)
Run Code Online (Sandbox Code Playgroud)

编辑:要快捷方式,只需编写一个方法:

def fname(file)
  File.dirname(__FILE__) + "/../til/../project/../root/../" + file
end
Run Code Online (Sandbox Code Playgroud)

编辑3:您还可以使用调用者来始终引用调用文件的目录:

def fname(file)
  path, _ = caller.first.split(':', 2)
  File.dirname(path) + "/" + file
end
Run Code Online (Sandbox Code Playgroud)