Help us understand the problem. What is going on with this article?

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)

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away