我的项目结构如下:
在main.rb(项目的根目录)和test.rb(在tasks文件夹下),我希望能够读取和解析info.config文件。我已经想出如何在main.rb中执行以下操作:
JSON.parse(File.read('info.config'))
当然,这在test.rb中不起作用。
问题:我怎样才能从test.rb中读取文件,即使它在层次结构中更深层次?
感谢我能得到的任何指导!谢谢!
答案 0 :(得分:7)
使用相对路径:
path = File.join(
File.dirname(File.dirname(File.absolute_path(__FILE__))),
'info.config'
)
JSON.parse(File.read(path))
File.dirname(File.absolute_path(__FILE__))
会为您提供test.rb
所在的目录。 - > (1)File.dirname(File.dirname(File.absolute_path(__FILE__)))
将为您提供(1)。参考:File::absolute_path
,File::dirname
<强>更新强>
使用File::expand_path
更具可读性。
path = File.expand_path('../../info.config', __FILE__)
JSON.parse(File.read(path))
答案 1 :(得分:2)
我通常做的是:
在项目根目录中创建名为environment
或类似名称的文件。此文件只有一个目的 - 扩展加载路径:
require 'pathname'
ROOT_PATH = Pathname.new(File.dirname(__FILE__))
$:.unshift ROOT_PATH
在代码开头需要此文件。从现在开始,每次调用require时,都可以将relative_path用于根目录,而不必担心需要它的文件位于何处。
使用File时,您可以轻松完成:
File.open(ROOT_PATH.join 'task', 'test.rb')
答案 2 :(得分:1)
您可以使用File::expand_path
执行以下操作:
path = File.expand_path("info.config","#{File.dirname(__FILE__)}/..")
JSON.parse(File.read(path))
File.dirname(__FILE__)
会为您提供"root_path_of_your_projet/tasks/"
的路径。
"#{File.dirname(__FILE__)}/.."
会为您提供"root_path_of_your_projet/"
的路径。 ..
表示从当前目录向上一级。
File.expand_path("info.config","root_path_of_your_projet/")
会以"root_path_of_your_projet/info.config"
为您提供文件的实际路径。
您也可以使用__dir__
代替File.dirname(__FILE__)
。
__dir__
:返回调用此方法的文件目录的规范化绝对路径。
希望解释有所帮助。