使用捆绑器,什么是判断宝石是否“可被要求”的最佳方式?

时间:2016-08-21 17:07:20

标签: ruby rubygems bundler

在我的Gemfile中说我有

group :test do
  gem 'rspec-core', require: false
end

是否有一种简单的方法可以查看test组是否已捆绑在一起? (例如,在这种情况下,bundle可能在有或没有--without test的情况下被调用。

我找不到一个,因此我开始寻找rspec-core是否可以获得,并找到了一些明显的解决方案:

 Bundler.definition.index.search("rspec-core")
 # or
 Gem.loaded_specs["rspec-core"]

确定宝石是否可以获得的最稳定的API是什么?

(不试图要求并拯救LoadError

2 个答案:

答案 0 :(得分:3)

当生成Rails应用程序时,它通常包含一行使用Rails.env来确定需要哪个组。它应该看起来像这样Bundler.require(:default, Rails.env)。这通常发生在Rails应用程序的初始化中。以下是一些代码的片段:

class Rails::Boot
  def run
    load_initializer

    Rails::Initializer.class_eval do
      def load_gems
        @bundler_loaded ||= Bundler.require :default, Rails.env
      end
    end

    Rails::Initializer.run(:set_load_path)
  end
end

因此,如果您对Rails.env进行测试,则需要测试组中的所有gem。

答案 1 :(得分:0)

我要继续说Gem.loaded_specs比通过捆绑包更可靠;我发现了一个捆绑器1.12.5的情况,我在其中一个组中有一个来自GitHub的宝石,我传递给without,这导致Bundler.definition.index.search引发Bundler::PathError引用宝石来自GitHub,我故意不捆绑。