1

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

生产代码:

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. 在开发 gem 时处理此类路径问题的最佳实践是什么?

编辑
由于__FILE__只返回它写入的文件的路径,目前我fname在我需要的每个文件中定义(参见@ckruse 的答案)之类的函数。它有效,但并不优雅。也许有人会有比我更好的解决方案。如果是这样,请告诉我。:)

4

1 回答 1

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:您也可以使用 caller 始终引用调用文件的目录:

def fname(file)
  path, _ = caller.first.split(':', 2)
  File.dirname(path) + "/" + file
end
于 2013-08-22T06:39:40.607 回答