Ruby项目中如何从父目录导入文件?
解决Ruby require_relative加载文件失败问题
文件夹结构
/home/user/ruby/forecast ├── forecast/ │ ├── api │ ├── olimp/ │ │ ├── api.rb │ │ ├── live/ │ │ │ ├── collect.rb │ │ │ └── convert.rb │ │ └── blog.rb
错误信息(中文翻译)
/home/user/ruby/forecast/olimp/live/convert.rb:1:in `require_relative': 无法加载指定文件 -- /home/user/ruby/forecast/olimp/live/api (LoadError) from /home/user/ruby/forecast/olimp/live/convert.rb:1:in `<top (required)>' from /home/user/ruby/forecast/olimp/live/collect.rb:2:in `require_relative' from /home/user/ruby/forecast/olimp/live/collect.rb:2:in `<main>'
问题原因与解决方法
从错误栈可以看出,实际报错的是convert.rb第一行的require_relative语句——它错误地在live目录下查找api文件,但目标文件api.rb实际位于上一级的olimp目录中。
修复步骤
修正
convert.rb的加载路径:
在convert.rb第一行,将加载语句改为:require_relative '../api.rb'(也可以省略
.rb后缀写成require_relative '../api',Ruby会自动识别匹配的文件)如果
collect.rb也要加载api.rb:
同样使用正确的相对路径:require_relative '../api.rb'
替代方案(全局加载路径)
如果不想依赖相对路径,可以把项目根目录加入Ruby的加载路径,之后就能直接按目录结构引用文件:
在collect.rb开头添加:
# 将olimp目录的上级目录加入加载路径 $LOAD_PATH.unshift(File.dirname(File.dirname(__FILE__))) # 直接引用api.rb require 'olimp/api'
内容的提问来源于stack exchange,提问作者SonyMag
相关产品推荐
相关产品推荐

