在处理开发宝石的“路径”时,我经历了一些痛苦。 这是文件夹结构
生产代码:
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
显然路径中的测试是错误的。
我的问题是,
修改:
由于__FILE__
只返回它所写文件的路径,因此我现在定义fname
(参见@ ckruse的答案),就像我需要的每个文件中的函数一样。 它有效,但它不优雅。也许有人会有比我更好的解决方案。如果是的话,请告诉我。:)
答案 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