1

我正在开发一个库,它提供对 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 实际上不存在,这使得它在开发环境中毫无用处。

4

1 回答 1

1

您始终可以使用提供的回溯工具:

caller.first

它产生文件和行的混合体,但通常用:. 我会小心地通过忽略行信息但保留其余部分来允许可能包含冒号的文件名或路径。换句话说,不要split但是sub

caller.first.sub(/:\d+:in .*$/, '')
于 2012-06-07T03:15:43.757 回答