我正在开发一个库,它提供对 gem 元数据的访问,包括它在文件系统上的位置。这个想法是让 gem 作者将其设置为任何脚本的相对路径:
# $root/example.gemspec
Example::Gem.root '.' # => $root/
# $root/lib/example/gem.rb
Example::Gem.root '../..' # => $root/
然后,当前脚本的路径将用于计算绝对路径。我的实现目前如下:
def root(relative_to = nil, file = __FILE__)
unless relative_to.nil?
@root = File.expand_path relative_to, File.dirname(file)
end
@root
end
我以为__FILE__
会返回调用者脚本的路径,但这种假设是错误的。
它在库本身内工作,但当我试图将它与我的其他宝石之一集成时崩溃了;生成的路径总是相对于支持库本身。
我怎样才能实现这一点而不必__FILE__
在每次通话时都传递电流?否则,没有多少价值可取;写作root('../..', __FILE__)
几乎和写一个实际的方法来做同样的事情一样。
如果可以在不指定任何内容的情况下找出路径,那就更好了,但我想不出任何东西。Rails 是如何做到的?
顺便说一句,我知道Gem::Specification#gem_dir
,但它总是返回相对于安装目录的路径,即使 gem 实际上不存在,这使得它在开发环境中毫无用处。