Docs header transparent bg

Bundlerによるアプリケーション依存関係の管理方法

このガイドは、Bundler v1.12用に書かれています。異なるバージョンを使用している場合は、出力結果が異なる可能性があることに注意してください。Bundlerのバージョンを確認するには、bundle -vを実行してください。

目次

  1. はじめに - Bundlerのインストールとbundle init
  2. Gemfileの編集
    1. ソース
    2. Gemの追加
    3. Gemfile構文
  3. Gemのインストール - bundle install
    1. 開発環境
    2. デプロイ
  4. Gemfile.lock
  5. コマンドの実行 - bundle exec
  6. Gemの更新 - bundle outdatedbundle update
  7. 推奨ワークフロー
  8. トラブルシューティング
    1. Bundlerを使用するプロジェクトでのgit bisectの実行

はじめに - Bundlerのインストールとbundle init

一部のフレームワークはBundlerを組み込みでサポートしています。例えば、rails new appを実行すると、Bundlerが自動的に初期化されます。

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

$ gem install bundler

このコマンドは、既にインストールされているBundlerも更新します。出力結果は以下のようになります。

$ gem install bundler
Successfully installed bundler-1.12.5
1 gem installed

Bundlerを手動で初期化するには、以下のようにします(bundler_exampleはアプリケーションのフォルダになります)。

$ mkdir bundler_example && cd bundler_example
$ bundle init

これにより、bundler_exampleフォルダ内にGemfileが作成されます。

# frozen_string_literal: true
# A sample Gemfile
source "https://rubygems.org"

# gem "rails"

Gemfileの編集

ソース

自動生成されたGemfileには、source "https://rubygems.org"が含まれています。これは、Bundlerがhttps://rubygems.orgでGemを検索することを意味します。独自の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の追加

次に、プロジェクトにいくつかの依存関係を追加しましょう。

# frozen_string_literal: true
# A sample Gemfile
source "https://rubygems.org"

gem "rails"

上記の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構文の詳細については、gemfileマニュアルページをご覧ください。

Gemのインストール - bundle install

開発環境

開発用のGemをインストールするには、bundle installを実行します。

出力結果は次のようになります。

Fetching gem metadata from https://rubygems.org/
Fetching version metadata from https://rubygems.org/
Fetching dependency metadata from https://rubygems.org/
Resolving dependencies...
Using mini_portile2 2.1.0
Using pkg-config 1.1.7
Using bundler 1.12.5
Using nokogiri 1.6.8
Bundle complete! 1 Gemfile dependency, 4 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

また、Gemfile.lockファイルも作成されます。

GEM
  remote: https://rubygems.org/
  specs:
    mini_portile2 (2.1.0)
    nokogiri (1.6.8)
      mini_portile2 (~> 2.1.0)
      pkg-config (~> 1.1.7)
    pkg-config (1.1.7)

PLATFORMS
  ruby

DEPENDENCIES
  nokogiri (>= 1.4.0)

BUNDLED WITH
   1.12.5

このGemfile.lockについては、次の章で説明します。

デプロイ

デプロイには、--deploymentオプションを使用してください。

$ bundle install --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: https://rubygems.org/
  specs:
    mini_portile2 (2.1.0)
    nokogiri (1.6.8)
      mini_portile2 (~> 2.1.0)
      pkg-config (~> 1.1.7)
    pkg-config (1.1.7)

PLATFORMS
  ruby

DEPENDENCIES
  nokogiri (>= 1.4.0)

BUNDLED WITH
   1.12.5

詳しく見ていきましょう。

  • GEM
    • remote - Gemのソース
    • specs - インストールされたGem(バージョン付き)。mini_portile2nokogiriの依存関係であることがわかります(インデントされているため)。
  • PLATFORMS - アプリケーションで使用されているプラットフォーム(詳細はこちら)。
  • DEPENDENCIES - Gemfileで定義されたGem。
  • BUNDLED WITH - 最後にGemfile.lockを変更するために使用されたBundlerのバージョン。

コマンドの実行 - bundle exec

まずは例を見てみましょう。

$ bundle exec rspec

$ bundle exec rails s

これにより、現在のバンドルコンテキストでコマンド(ここではrspecrails s)を実行でき、Gemfile内のすべてのGemをrequireして使用できるようになります。


bundle execコマンドの詳細については、こちらをクリックしてください。

Gemの更新 - bundle outdatedbundle update

次に、いくつかの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"

Gemを指定することもできます(bundle outdated *gems)。

nokogiriはバージョン1.6.7.2でロックされています。どのように更新できますか?bundle installは、Gemfile.lockファイルでロックされているため、新しいバージョンをインストールしません。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
  • 別の開発マシンでこのリポジトリをチェックアウトする場合は、以下を実行します。
$ 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ガイドを参照してください。

エラーを見つけた場合、または何か不足していることに気づいた場合は、GitHubでこのドキュメントを編集してください