Ruby on rails gem的基本/主目录

Ruby on rails gem的基本/主目录,ruby-on-rails,ruby,rubygems,bundler,Ruby On Rails,Ruby,Rubygems,Bundler,作为RSpec的一部分,我需要引用一个包含在我所依赖的gem中的文件(称之为gemfoo)。我控制gemfoo,因此可以根据需要对其进行更改 Gem'foo'包含一个我需要在rspec规范中引用的文件。是否有一个合理稳定的RubyGem或Bundler API来确定'foo'基本目录? 假设我的GEM文件中已经需要“foo”: 在文件中: 我想做一些类似的事情(在something_spec.rb中): 什么是gem\u base\u path API调用?我建议您在gem中创建一个函数来执行此

作为RSpec的一部分,我需要引用一个包含在我所依赖的gem中的文件(称之为gemfoo)。我控制gemfoo,因此可以根据需要对其进行更改

Gem'foo'包含一个我需要在rspec规范中引用的文件。是否有一个合理稳定的RubyGem或Bundler API来确定'foo'基本目录?

假设我的GEM文件中已经需要“foo”: 在文件中:

我想做一些类似的事情(在something_spec.rb中):


什么是gem\u base\u path API调用?

我建议您在gem中创建一个函数来执行此操作:

module Foo
  class Configuration
    def self.result_xml_path
      File.realpath("../examples/xml/result.xml")
    end
  end
end
然后,可以在等级库中执行以下操作:

filename = Foo::Configuration.result_xml_path

这是更安全的,因为你是从创业板获得所有的信息。它看起来也更干净。

这可以满足您的需要,而无需触碰
'foo'
宝石:

matches = Gem::Specification.find_all_by_name 'foo'
spec = matches.first
filename = File.expand_path('examples/xml/result.xml', spec.full_gem_path)

我用这段代码做了一些类似于您需要的东西(即在我的规范中加载我的项目使用的gem中定义的一些工厂)

我喜欢向目标gem添加方法。可疑文件.realpath应该有
文件。展开路径(“../examples/xml/result.xml“,\uuuuu File\uuuu)
。有没有办法在不修改目标宝石的情况下做到这一点?我不确定我是否理解你的问题。你能澄清一下吗?File.realpath“返回实际文件系统中不包含符号链接或无用点的路径名的真实(绝对)路径名”,因此您应该能够使用它,而不必担心相对路径。看起来像
File\realpath
接受2个参数,如果没有第2个参数,它将返回相对于当前工作目录的结果。想一想,您的意思是返回相对于包含正在执行的文件的目录的路径。不,它是相反的方式。没有第二个参数,它返回系统中的绝对路径。对于第二个路径,它将基于第二个参数返回一个相对路径。但为了返回绝对路径,它将第一个参数(如果是相对的)解释为从当前工作目录开始,或者从第二个参数(如果不是nil)开始。仍然认为需要在上面第三行添加
\uuuuuuu文件
filename = Foo::Configuration.result_xml_path
matches = Gem::Specification.find_all_by_name 'foo'
spec = matches.first
filename = File.expand_path('examples/xml/result.xml', spec.full_gem_path)