【问题标题】:How to find the path a Ruby Gem is installed at (i.e. Gem.lib_path c.f. Gem.bin_path)如何找到安装 Ruby Gem 的路径(即 Gem.lib_path c.f. Gem.bin_path)
【发布时间】:2012-04-10 13:36:14
【问题描述】:
Gem.bin_path('cucumber', 'cucumber')

将返回二进制/可执行文件的路径。 似乎没有这样的函数来返回库路径。 在这种情况下,理想情况下会返回:

/home/hedge/.rvm/gems/ruby-1.9.2-p136@bbb-bdd-meta-bdd/gems/cucumber-0.10.0/lib

我是否遗漏了什么,或者是否有一种简单/单一的方法来获取此信息?

更新:请不要提供 CLI 或非标准库建议。

【问题讨论】:

    标签: ruby api rubygems


    【解决方案1】:

    检查答案的问题是您必须“要求”rubygem,否则它将不起作用。这通常是不可取的,因为如果您正在使用可执行的 gem,您不想“要求”它,否则您会收到一堆警告。

    这是可执行文件和库的通用解决方案:

    spec = Gem::Specification.find_by_name("cucumber")
    gem_root = spec.gem_dir
    gem_lib = gem_root + "/lib"
    

    如果您想获得真正的技术知识,那么 lib 目录不止一个。 gemspec 有一个包含所有要搜索的目录的“require_paths”数组(添加到 $LOAD_PATH)。因此,如果您想要一个 require_paths 数组,请使用:

    gem_lib = gem_root + "/" + spec.require_paths[0]
    

    不需要捆绑器。

    【讨论】:

      【解决方案2】:

      使用 require 加载 gem 后,使用 Gem.loaded_specs 找到 lib 路径,如下所示:

      require 'rubygems'
      require 'cucumber'
      gem_root = Gem.loaded_specs['cucumber'].full_gem_path
      gem_lib = File.join(gem_root, 'lib')
      

      【讨论】:

      • 例如,这非常适用于 ruby​​gems 1.3.6(mac 上的标准版本),而 Gem::Specification.find_by_name("cucumber") 则不会。干杯家伙,帮我省了一大堆麻烦!
      【解决方案3】:

      我不确定您为什么要这样做,但如果您在命令行上,请使用 gem env

      【讨论】:

      • 对不起,应该是明确的 - 没有 cli,只有 api。
      • 感谢您的简洁,正是我想要的。
      【解决方案4】:

      尝试使用bundle show cucumber

      其中,从 bundler 的源代码来看,类似:

      spec = Bundler.load.specs.find{|s| s.name == name }
      spec.full_gem_path
      

      正在使用捆绑程序,对吗?

      【讨论】:

      • 对 Bundler 说不,我已经对它进行了广泛的修补,所以当你开始在游览代码中使用它时知道会发生什么。尽管如此,仅列出的 git 问题就使其不受限制-但值得关注:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多