Bundler.require

2013年12月13日のメモ。

Bundler.require は、Gemfile で管理している gem を自動的にロードする。 引数に、group を渡してやるとその group の gem が自動的にロードされる。 引数がなかったり、:default を渡すと group メソッドのブロックに囲まれていない gem がロードされる。

例えば、以下のような Gemfile があるとする。

# Gemfile

gem 'sinatra'

group :development do
  gem 'pry'
end

group :test do
  gem 'rspec'
end

このときに、

  • Bundler.require すると sinatra だけロードされる
  • Bundler.require(:development) とすると pry だけロードされる
  • Bundler.require(:default, :test) とすると sinatra と rspec がロードされる

Bundler.require の実装は、

def require(*groups)
  setup(*groups).require(*groups)
end

となっていて、

最初に Bundler.setup が呼ばれて、その返り値に対して require が呼ばれている。 この require は、Bundler::Runtime#require で、Kernel.require してる。

結局、Bundler で、

require 'bundler/setup' あるいは require 'bundler'; Bundler.setupは、 Gemfile で管理している gem をロードパスに追加するということをしている。

require 'bundler'; Bundler.requireは、 Bundler.setup して、Gemfile で管理している gem を require している。