Bundlerの使い方

Kazunori Kamiya
10 min readSep 14, 2017

--

・Bundlerとbundle initのインストール

まず最初に、Bundlerをインストールする必要があります。

“gem install bundler”でBundlerをインストールでき、既にインストール済みであればアップデートすることもできます。
実行すると、大体下の画面のような感じになるはずです。

手動でBundlerを使い始めるために、”bundler_example”というフォルダを作成してみましょう。

また、これを実行することで”bundler_example”の中に”Gemfile”が生成されます。

Gemfileの編集について

自動生成されたGemfileは、source “https://rubygems.org"から構成されています。
これはどういう意味かというと、Bundlerがgemを”https://rubygems.org”の中に探しに行くということです。
もし自分自身のRubyGemsサーバー、あるいは異なるサーバーを使いたい場合は、以下のように変更してください。

source "https://your_ruby_gem_server.url"

他にもいくつかgemのソースを持っていれば、ブロックあるいは”:source”を使うこともできます。

source "https://your_ruby_gem_server.url" do
# gems
end

gem "my_gem", source: "https://your_2_ruby_gem_server.url"

ブロック内のgemは、与えられたソースから回収されます。

“source”についてもっと知りたい場合は、ここを見るといいでしょう。

Gemへの追加

ここでは、いくつかの依存性をプロジェクトに追加してみましょう。

上記のGemfileを使って、”bundler install”は”rails”gemの最新バージョンをインストールします。

特定のバージョンを指定したい場合は、以下のようにカンマの後にそのバージョンを指定すればいいです。

gem "rails", "3.0.0"

あるいはシンタックスを用いて、以下のようにもできます。

gem "rails", "~> 4.0.0" # which is same as gem "rails", ">= 4.0.0", "< 4.1.0" 
gem "nokogiri", ">= 1.4.2"

Gemfileにおけるgemについて詳しく知りたい場合は、このサイトを見てください。

Gemfileのシンタックスについてより深く

Gemfileについてもっと詳しく知りたい場合は、ここを見てください。

Gemのインストールとbundleのインストール

開発について

開発のためにgemをインストールするには、”bundle install”を実行すればよいです。
そうすると、以下の画面と似たようなものが出てくるはずです。

また、そうするとGemfile.lockというものが作成されます。

Gemfile.lockに関しては、次の章で見ていきます。

デプロイについて

デプロイするには、 — deploymentというオプションを使います。

こうすることで、”./vendor/bundle”に関する全ての依存性をインストールすることができます。

また、このコマンドを実行するには、必要なものがいくつかあります。

  1. “Gemfile.lock”というファイルが必要である。
  2. “Gemfile.lock”が最新化されること。

“bundle install”というコマンドについてもっと詳しく知りたい場合は、ここをクリックしてください。

Gemfile.lock

Bundlerはこのファイルを、全てのgemの名前とバージョンを保存しておくために使用します。
もしアプリケーションがマシンから取り除かれたとしても、それはいつも使っているのと全く同じコードを保証してくれます。
初めてある特定のgemをインストールした後、Bundlerはそのバージョンを固定します。
それを更新するには、bundler updateを使う、もしくはGemfile内のそのバージョンを変更する必要があります。

このファイルは、Bundlerのコマンド(bundle installやbundle updateなど)を使用した際に自動で生成され、バージョンコントロールの際にこれをチェックしてください。

前の章で見たGemfile.lockは、以下のようなものでした。

これをもう少し噛み砕くと、以下のようになります。

  • GEM
  • remote - gemのソースです。
  • specs - インストールされているgem(とそのバージョン)です。
  • PLATFORMS - アプリケーションで使われているプラットフォームです。(詳しくはここを見てください。)
  • DEPENDENCIES -Gemfileで定義されているgemです。
  • BUNDLED WITH - Gemfile.lockを変更するために最後に使われたBundlerのバージョンです。

コマンドの実行 — bundle exec

まず最初に、例を見てみましょう。

$ bundle exec rspec

$ bundle exec rails s

こうすることで、現在のbundle環境におけるコマンド(ここでは”rspec”と”rails s”)を実行することが可能になり、Gemfile内の全てのgemで”require”を使うことで使用することができます。

“bundle exec”について詳しく知りたい場合は、ここを見てください。

Gemの更新 — bundle outdatedとbundle updated

では、いくつかgemをアップデートしてみましょう。
“bundle outdated”を使えば、インストールされているgemの最新バージョンのリストを見ることができます。

$ bundle outdated
Fetching gem metadata from https://rubygems.org/
Fetching version metadata from https://rubygems.org/
Fetching dependency metadata from https://rubygems.org/
Resolving dependencies.......

Outdated gems included in the bundle:
* nokogiri (newest 1.6.8, installed 1.6.7.2) in group "default"

“bundle outdated *gems”を使えば、gemを指定することもできます。

もしバージョンが1.6.7.2になっている”nokogiri”があったとして、どうすればそれをアップデートできるでしょうか?
“Gemfile.lock”で固定されているため、”bundle install”では新しいバージョンのものをインストールできません。
そのため、ここでは”bundle update”というコマンドを使います。

$ bundle update
Fetching git://github.com/middleman/middleman-syntax.git
Fetching gem metadata from https://rubygems.org/
Fetching version metadata from https://rubygems.org/
Fetching dependency metadata from https://rubygems.org/
Resolving dependencies.....
Installing nokogiri 1.6.8 (was 1.6.7.2) with native extensions
Using i18n 0.7.0

... (and more)

Bundle updated!

何も指定せずに”bundle update”と打った場合は、全てのgemを最新バージョンにアップデートします(Gemfileによって制止されています)。

特定のgemをアップデートするには、”bundle update *gems”を実行してください。

“bundle outdated”について詳しく知りたい場合は、このページを読んでみてください。
“bundle update”について詳しく知りたい場合は、このページを読んでみてください。

オススメのワークフロー

一般的に、bundlerによって管理されているアプリケーションを動かす場合、以下のコマンドについては知っておくべきでしょう。

・Bundlerを初期化するには

$ bundle init

・初めて”Gemfile”を作成した後には

$ bundle install

・”Gemfile.lock”の成果をバージョンコントロールに追加するには

$ git add Gemfile.lock

・このリポジトリをもう1つのデプロイマシンに反映させるには

$ bundle install

・このリポジトリをデプロイマシンに反映させるには

$ bundle install --deployment

・最新の依存性を”Gemfile”の変更後に反映させるには

$ bundle install

・アップデートしたgemfile.lockを確実にバージョンコントロールに反映させるには

$ git add Gemfile.lock

・”bundle install”が矛盾を訴えてくる場合、”Gemfile”内で変更したgemを手動でアップデートする必要があります。

$ bundle update rails thin

・Gemfile(5)内にリストアップされているgemとマッチする全てのgemを最新バージョンにアップデートするには

$ bundle update

トラブルシューティング

Bundlerを使っているプロジェクト内で”git bisect”を実行してください。
Git Bisect Guideを見るといいでしょう。

--

--