在处理开发宝石的"路径"时,我经历了一些痛苦.这是文件夹结构
生产代码:
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)
显然路径上的测试是错误的.
我的问题是,
编辑:
因为__FILE__只返回它所写文件的路径,所以我现在定义fname(参见@ ckruse的答案)就像我需要的每个文件中的函数一样.它有效,但不优雅.也许有人会在这方面找到比我更好的解决方案.如果是的话,请告诉我.:)
您始终可以引用当前文件的目录,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)