Edited at

Bundlerでgemを実用的に扱うためのまとめ

More than 3 years have passed since last update.

特にrails開発においては、bundlerを扱うための処理が予め記述されているため、bundlerについて意識しなくてもrails pluginの導入を速やかにできるようになっている。

bundlerについて基礎から学びしなおしつつ、bundlerを使った実用的なGemの運用について考えます。


基本的な使い方


コマンド

Gemfileに記述されたgemを一括でインストールする

bundle install

Gemfileに記述されたgemを一括でバージョンアップデートする

bundle update

※ 正しくは環境変数'BUNDLE_GEMFILE'で指定されたgemfileか、指定されてないときはカレントディレクトリのGemfileを見るようになっています。


Gemfile


Gemfile

source 'https://rubygems.org'

gem 'gemの名前', 'バージョン指定'



バージョニングの大まかな意味合い

以下文章中でも使うバージョニングを言い表す際に使うワードとおおまかな意味合いについて触れておく。


PATCH 0.0.x

APIの変更のない実装レベルの修正。バグフィックス等。


MINOR 0.x.0

後方互換性をもったAPIの変更など。新機能、新APIの実装等。


MAJOR x.0.0

アップデートするとユーザーの実装が動かなくなるような後方互換性のない変更を含む場合。


Gemのインストール先を指定する

複数のプロジェクトで扱うgemをそれぞれ個別に管理したい場合に、プロジェクトルートディレクトリ配下にgemをインストールする。

例えば./vendor/bundle以下にgemをインストールしたい時

bundle config --local path vendor/bundle

で、次回からのbundle or bundle install時に指定したパスにインストールされるようになる。

また、

bundle --path vendor/bundle

こうするとvendor/bundleにインストールし、次回からも同じパスにインストールするようになる。

ちなみに、この設定はプロジェクトルートの.bundle/configに記述される。


Gemのホスティングサーバー


Gemのホスティングサーバーを指定する時


Gemfile

source 'https://rubygems.org'



ホスティングサーバーを自分でたてたい時

クローズドな開発で複数プロジェクトをまたがる機能実装をgem化して切り出した時などが考えられる。

独自のgemのホスティングサーバーを立てたい場合はGem in a boxを用いると簡単にできる。


rubyのバージョンを指定する

扱うbundlerをインストールしたrubyのバージョンを指定する。

cat .ruby-version

2.3.1


Gemfile

ruby '2.3.1'

source 'https://rubygems.org'



インストールするgemのバージョン指定

多くは自明であるがちゃんとメモする。


直接指定


Gemfile

gem 'example', '1.2.3' # 1.2.3のみをつかう



超過 / 未満


Gemfile

gem 'example', '> 1.2' # 1.2を超過

gem 'example', '< 1.2' # 1.2未満


以上 / 以下


Gemfile

gem 'example', '>= 1.2' # 1.2以上

gem 'example', '<= 1.2' # 1.2以下


よく使われるちょっと特殊なやつ


Gemfile

gem 'example', '~> 1.2' # 1.2以上かつ2.0未満


MINORバージョンまで指定しているときは同じMAJORバージョンの中で最新の物を扱う。

例えばMINORバージョンアップデートでは動くがMAJORバージョンアップデートでは動かない可能性のある場合に上記の様に指定します。指定されている数値は開発時のバージョンを指定することが多いです。

テスト等でMINORバージョンごとに正しく動作するか検証したい場合等ではPATCHバージョンまで指定して、MINORバージョンごとの最新のバージョンを用いるようにします。


複数のGemfileを使い分けたい時

bundlerをつかうときに環境変数BUNDLE_GEMFILEで利用するGemfileを指定することができる。

コマンドラインやコードベースの中で応用できる。

BUNDLE_GEMFILE=gemfiles/local.gemfile bundle update

BUNDLE_GEMFILE=gemfiles/local.gemfile bundle exec


boot.rb

ENV['BUNDLE_GEMFILE'] ||= "gemfiles/#{environment}.gemfile"

require 'bundler/setup'

ユースケースとしては依存しているgemの複数のバージョンで正しく動作するかどうかを検証したい時等が考えられる。(rails pluginなど)

たとえばMINORバージョンごとにテストしたい時、以下のようにGemfileをいくつか用意する。


test/gemfiles/rails_4_2.gemfile

gem 'rails', '~> 4.2.0' # 4.2.0以上かつ4.3.0未満



test/gemfiles/rails_4_1.gemfile

gem 'rails', '~> 4.1.0' # 4.1.0以上かつ4.2.0未満



環境ごとにインストールするgemを指定する

デバッガ等の開発中にのみ使いたくて、production環境ではインストールしたくないgemをGemfileで管理する。


Gemfileでの指定方法

複数のgemをインストールしたい環境を指定する時


Gemfile

group :development do

gem 'only_development1'
gem 'only_development2'
end

group :development, :test do
gem 'only_development_and_test1'
gem 'only_development_and_test2'
end


一つのgemを一行でインストールしたい環境を指定するとき。


Gemfile

gem 'only_development', group: :development

gem 'only_development_and_test', group: %i(development test)


bundlerでの読み込み

productionではテスト環境や開発環境のみで扱うgemをインストールする必要はない。そういった場合にdevelopmentやtestで指定されたgemをインストールしないようにする。

bundle install --without test development

コードの中で開発環境のみで扱うgemもインストールするようにする時。


boot.rb

Bundler.require(:default, :development)


または


boot.rb

Bundler.setup(:default, :development)



参考