Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何找到宝石的位置?_Ruby_Path_Gem - Fatal编程技术网

Ruby 如何找到宝石的位置?

Ruby 如何找到宝石的位置?,ruby,path,gem,Ruby,Path,Gem,我正在开发一个库,提供对gem元数据的访问,包括它在文件系统中的位置。其想法是让gem作者将其设置为来自任何脚本的相对路径: # $root/example.gemspec Example::Gem.root '.' # => $root/ # $root/lib/example/gem.rb Example::Gem.root '../..' # => $root/ 然后,将使用当前脚本的路径来计算绝对路径。我目前的执行情况如下: def root(rela

我正在开发一个库,提供对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
我原以为
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
会返回调用方脚本的路径,但这种假设是错误

它在图书馆内部工作,但当我试图将它与我的另一个珍宝集成时,它崩溃了;生成的路径始终相对于支持库本身

我如何在每次调用时都不必传递当前的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuu文件
就可以实现这一点?否则,就没有多少价值可言;编写
根(“../…”,_文件_)
几乎与编写实际方法来执行相同的操作相同

如果可以在不指定任何内容的情况下找出路径,那就更好了,但我想不出任何东西。Rails是如何做到的


顺便说一句,我知道,但它总是返回相对于安装目录的路径,即使gem实际上不在那里,这使得它在开发环境中毫无用处。

您始终可以使用提供的回溯功能:

caller.first
它生成文件和行的混合体,但通常由
分隔。无论出于何种原因,我都会小心地允许文件名或路径包含冒号,忽略行信息,但保留其余部分。换句话说,不要拆分,而是拆分:

caller.first.sub(/:\d+:in .*$/, '')

您始终可以使用提供的回溯功能:

caller.first
它生成文件和行的混合体,但通常由
分隔。无论出于何种原因,我都会小心地允许文件名或路径包含冒号,忽略行信息,但保留其余部分。换句话说,不要拆分,而是拆分:

caller.first.sub(/:\d+:in .*$/, '')

一个开始就是处理调用方。首先,根据需要处理字符串。我不确定是否有更好的版本。@tadman,该方法实现的输出是否已定义?不管怎样,我会查出来的。@tadman,你的解决方案行得通!我不确定是否有任何陷阱,但从我读到的,它正是我需要的。添加一个正确的答案,以便我可以接受它!一个开始就是处理调用方。首先,根据需要处理字符串。我不确定是否有更好的版本。@tadman,该方法实现的输出是否已定义?不管怎样,我会查出来的。@tadman,你的解决方案行得通!我不确定是否有任何陷阱,但从我读到的,它正是我需要的。添加一个正确的答案,以便我可以接受它!谢谢你提醒我。我使用了
/:\d+(:in.*)\z/
,因为文档说明
调用者可以在
文件:行
文件:行:in方法
格式中返回字符串。谢谢提醒。我使用了
/:\d+(:in.*)\z/
,因为文档说明
调用者可以在
文件:line
文件:line:in方法
格式中返回字符串。