【发布时间】:2012-04-12 22:46:18
【问题描述】:
有没有办法知道我的 gem 的根路径?我正在尝试从 gems 路径中的 yaml 加载默认配置。如何使用 ruby 获取 gems 根目录?
【问题讨论】:
有没有办法知道我的 gem 的根路径?我正在尝试从 gems 路径中的 yaml 加载默认配置。如何使用 ruby 获取 gems 根目录?
【问题讨论】:
给定以下项目结构:
your_gem/
lib/
your_gem.rb
我会这样做:
# your_gem.rb
module YourGem
def self.root
File.expand_path '../..', __FILE__
end
end
Ruby 2.0 引入了Kernel#__dir__ 方法;它可以实现更短的解决方案:
# your_gem.rb
module YourGem
def self.root
File.dirname __dir__
end
end
如果您需要访问其他目录,您可以简单地在 root 上构建:
module YourGem
def self.bin
File.join root, 'bin'
end
def self.lib
File.join root, 'lib'
end
end
【讨论】:
File.dirname __dir__ 对我不起作用。我收到此错误:TypeError: no implicit conversion of nil into String。碰巧知道为什么?谢谢。
__dir__ is documented to return nil if __FILE__ is also nil。你是如何运行你的脚本的?
__dir__。我只是从一个文件中运行 if ,并得到了想要的结果。谢谢老哥!
File.expand_path('../', File.dirname(__FILE__) 是我平时看到的。
这是可执行文件和库的通用解决方案。它使用 Gem API 加载规范,因此路径始终正确:
spec = Gem::Specification.find_by_name("your_gem_name")
gem_root = spec.gem_dir
yaml_obj = YAML.load(gem_root + "/file_name.yaml")
【讨论】:
File.join 代替字符串连接。
File.join 确保您为您的操作系统使用适当的路径分隔符,从而使代码跨平台。 “/”是特定于 linux 的。 Microsoft Windows 的许多版本(全部?)都使用“\”。
gem list <gem> -d
或者,如果您使用的是捆绑器:
bundle show <gem>
【讨论】: