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

时间:2013-08-22 03:40:03

标签: ruby gem rubymine

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

生产代码:

lib/gem_name/foo/templates/some_template.erb
lib/gem_name/foo/bar.rb

测试代码:

test/gem_name/foo/bar_test.rb

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

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

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

Errno::ENOENT: No such file or directory - D:/.../test/gem_name/foo/templates/some_template.erb

显然路径中的测试是错误的。

我的问题是,

  1. 如何处理这个问题?
  2. 处理的最佳做法是什么 开发宝石时出现这样的路径问题?
  3. 修改
    由于__FILE__只返回它所写文件的路径,因此我现在定义fname(参见@ ckruse的答案),就像我需要的每个文件中的函数一样。 它有效,但它不优雅。也许有人会有比我更好的解决方案。如果是的话,请告诉我。:)

1 个答案:

答案 0 :(得分:5)

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

fname = File.dirname(__FILE__) + "/templates/some_template.rb"
File.read(fname)

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

def fname(file)
  File.dirname(__FILE__) + "/../til/../project/../root/../" + file
end

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

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