Gemfile

Rubyプログラムのための、Gemの依存性を記述するフォーマットです。

概要

Gemfileには、Rubyコードを実行するために必要なGemの依存関係が記述されます。

Gemfileは、コードが含まれるディレクトリのルートに配置して下さい。 例えば、Railsアプリケーションであれば、Rakefileと同じディレクトリに配置して下さい。

文法

多くのメソッドが必要なGemを記述する際に、それを利用可能にするためのコンテキストの中で、 GemfileはRubyコードとして評価されます。

グローバルな供給元 (#source)

Gemfileの先頭で、Gemfile内に記述されるGemの供給元となるRubygemsの行を追加します。

source "https://rubygems.org"

Bundler 1.7では非推奨ですが、複数のグローバルな供給元(source)の行を追加することも可能です。 それぞれのsourceは、正しいRubygemsのリポジトリで無ければいけません

「供給元優先度(source priority)」に記述された内容を基にして、 Gemのためにヒューリスティクスに従って供給元(source)の確認が行われます。 複数のグローバル供給元(global source)でGemが見つかると、 BundlerはそのGemのインストール後に、 そのGemのために使用された供給元、そのGemが利用可能であった他の供給元のリストを示す警告を出力します。 指定する供給元はGemが必要とするのであれば、:sourceオプション、 またはsourceブロックを使用することでこの警告を抑え、 非標準のリポジトリを選択することが可能です。

認証(credentials)

一部のGem供給元(source)は、ユーザー名とパスワードを必要とします。 bundle configを使用して、ユーザー名とパスワードを必要とする一部の供給元のためにそれを設定します。 このコマンドは、そのGemfileがインストールされる各マシン上でそれぞれ一度実行しなければいけませんが、 バージョン管理ツールに認証情報のプレーンテキストが格納されることで、この情報は保持されます。

bundle config https://gems.example.com/ user:password

Gemfury社のアカウントのような一部の供給元では、 認証情報を単にGemfile内のsourceのURLの一部として含めることも可能です。

source "https://user:password@gems.example.com"

URLの認証情報は、configを使用して設定された認証情報よりも優先されます。

Ruby (#ruby)

もし、あなたのアプリケーションが特定のRubyのバージョン、またはエンジンを必要とするのであれば、 下記の引数とRubyのメソッドを使用して必要とするものを指定します。 特に指定が無い引数は、任意(OPTIONAL)になります。

バージョン (必須)

アプリケーションで必要とされるRubyのバージョンを指定します。 JRubyやRubiniusのような代わりのRubyエンジンが必要なのであれば、 そのエンジンと互換性のあるRubyのバージョンにする必要があります。

ruby "1.9.3"
Rubyエンジン (:engine)
各アプリケーションに、Rubyエンジンを指定することが可能です。 もし、エンジンを指定するのであれば、エンジンのバージョンも指定しなければいけません。
Rubyエンジンのバージョン (:engine_version)

各アプリケーションに、Rubyエンジンのバージョンを指定することが可能です。 エンジンのバージョンを指定するのであれば、エンジンのバージョンも指定しなければいけません。 もし、エンジンが"ruby"なのであれば、そのエンジンのバージョン指定はそのRubyのバージョンにマッチしなければいけません。

ruby "1.8.7", :engine => "jruby", :engine_version => "1.6.7"
パッチレベル (:patchlevel)

各アプリケーションに、Rubyのパッチレベルを指定することが可能です。

ruby "2.0.0", :patchlevel => "247"

Gem (#gem)

下記の引数とgemメソッドを使用して必要とするGemを指定します。 特に指定が無い引数は、任意(OPTIONAL)になります。

名前 (必須)

必要とする各Gemを、単一のgem行として指定します。

gem "nokogiri"
バージョン

各Gemには、1つまたは複数のバージョンを指定することも可能です。

gem "nokogiri", ">= 1.4.2"
gem "RedCloth", ">= 4.1.0", "< 4.2.0"
必要とするファイル (:require)

各GemがBundler.requireを通して自動的にrequireされる際に、 使用されるべきファイルを指定することが可能です。 複数のファイルを指定したファイルの配列、 必要とするファイルがGemと同じ名前を持つ場合はtrue、 自動的にrequireされることを防ぎたい場合はfalseを渡すことが可能です。

gem "redis", :require => ["redis/connection/hiredis", "redis"]
gem "webmock", :require => false
gem "debugger", :require => true

この引数のデフォルトは、Gemの名前になります。 例えば、下記の3つは全て同じ意味になります。

gem "nokogiri"
gem "nokogiri", :require => "nokogiri"
gem "nokogiri", :require => true
グループ(:group または :groups)

各Gemは、1つまたは複数のグループに属することが可能です。 どのグループにも属さないGemは、defaultグループに属することになります。

gem "rspec", :group => :test
gem "wirble", :groups => [:development, :test]

Bundler実行時に、Bundler.setupBundler.requireの2つの主メソッドに対し、 特定のグループがそれらに及ぼす影響を制限することが出来ます。

# setupは、Rubyの読み込みパス(load path)へGemを追加します
Bundler.setup                    # デフォルトでは、全てのグループがセットアップされます。
require "bundler/setup"          # Bundler.setupと同様です。
Bundler.setup(:default)          # defaultグループだけがセットアップされます。
Bundler.setup(:test)             # testグループ(defaultは含まれない)だけがセットアップされます。
Bundler.setup(:default, :test)   # defaultとtestグループがセットアップされます。

# 指定されたグループ内の全てのGemをrequireします。
Bundler.require                  # デフォルトは、defaultグループだけがrequireされます。
Bundler.require(:default)        # 上記と同様です。
Bundler.require(:default, :test) # defaultとtestグループをrequireします。
Bundler.require(:test)           # testグループだけをrequireします。

BundlerのCLIは、--withoutオプションを付けることで、 bundle installでインストールすべきでは無いGemのグループのリストを指定することが可能です。 複数のグループを無視するには、空白でそれらのグループを区切ります。

bundle install --without test
bundle install --without development test

bundle install --without testの実行後に、 Bundlerは最後のインストールで除外したtestグループを記憶します。 次のbundle installの実行時に--withoutオプションが無くても、 Bundlerは同じ呼び出しを行います。

また、引数無しのBundler.setupの呼び出し、 またはrequire "bundler/setup"の呼び出しは、 --withoutによって除外されたものを除く全てのグループのsetupを行います。 (言うまでもありませんが、それらを利用することは出来ません)

bundle installの際に、 Bundlerは必要とされるGemとそれらの依存性の全ての正統な単一のリストを作成するために、 全てのGemのダウンロードと評価を行うことに注意してください。 これは、異なるグループで、同じGemの異なるリストを作成することが出来ないことを意味します。 詳細については、Bundlerの原理を参照してください。

プラットフォーム (:platforms)

もし、Gemが特定のプラットフォーム、または特定のプラットフォームの集まりでのみ使用されるべきなのであれば、 それを指定することが可能です。 他のプラットフォームのために、Gemのグループを除外するインストール時の--withoutを必要としない点を除いて、 本質的にはグループと同じです。(翻訳に自信なし)

Gemfileには多数のプラットフォームが存在します。

rubyC Ruby (MRI) or Rubinius, but NOT Windows
ruby_18ruby AND version 1.8
ruby_19ruby AND version 1.9
ruby_20ruby AND version 2.0
ruby_21ruby AND version 2.1
ruby_22ruby AND version 2.2
mriSame as ruby, but not Rubinius
mri_18mri AND version 1.8
mri_19mri AND version 1.9
mri_20mri AND version 2.0
mri_21mri AND version 2.1
mri_22mri AND version 2.2
rbxSame as ruby, but only Rubinius (not MRI)
jrubyJRuby
mswinWindows
mingwWindows 32 bit 'mingw32' platform (aka RubyInstaller)
mingw_18mingw AND version 1.8
mingw_19mingw AND version 1.9
mingw_20mingw AND version 2.0
mingw_21mingw AND version 2.1
mingw_22mingw AND version 2.2
x64_mingwWindows 64 bit 'mingw32' platform (aka RubyInstaller x64)
x64_mingw_20x64_mingw AND version 2.0
x64_mingw_21x64_mingw AND version 2.1
x64_mingw_22x64_mingw AND version 2.2

グループと同様、1つ以上のプラットフォームを指定することが可能です。

gem "weakling",   :platforms => :jruby
gem "ruby-debug", :platforms => :mri_18
gem "nokogiri",   :platforms => [:mri_18, :jruby]

グループを伴う全ての操作(bundle installBundler.setupBundler.require)は、 現在のプラットフォームと一致しない全グループが、明示的に除外された場合と全く同じ挙動をします。

Gem供給元 (:source)

:sourceオプションを使用して、Rubygemsの代わりにGem用のリポジトリを選択することが出来ます。

gem "some_internal_gem", :source => "https://gems.example.com"

これは、このsourceからGemを読み込むことを強制させて、 ファイルの先頭で宣言されるグローバルなsourceを無視します。 もし、このsourceにGemが存在しなければ、インストールは行われません。

Bunlderは最初に選択されたsource内で親を探すことで、そのGemの子の依存性を検索しますが、 もしそれらが見つからなかった場合は、sourceの優先度に記述された順番に従って、 グローバルのsourceをフォールバックします。

この方法で特定のsourceリポジトリを選択する方法は、 前述したグローバルな供給元 (#source)で説明した不明確なGemを抑制することにも繋がります。

GIT (:git)

必要であれば、特定のGitリポジトリに置かれているGemを指定することが可能です。 リポジトリは、公開(public - http://github.com/rails/rails.git)、 またはプライベート(private - git@github.com:rails/rails.git)のどちらかになります。 もし、リポジトリがプライベートであれば、bunlde installを行うユーザーは、 $HOME/.ssh内で利用可能な適切なキーを持たなければいけません。

Gitリポジトリは、:gitパラメーターで指定します。 groupplatformsrequireオプションが利用可能で、 通常のGemと同じように使用することが出来ます。

gem "rails", :git => "git://github.com/rails/rails.git"

Gitリポジトリは、gemが含まれるディレクトリのルートに拡張子が.gemspecのファイルを、 少なくとも1つは持つべきです。 このファイルには、gem buildコマンドに必要とされる正しいGemの仕様が含まれていなければなりません。

もしGitリポジトリが.gemspecを持たなければ、 Bundlerはそれを作成しようと試みますが、 依存性、実行ファイル、C拡張のコンパイル手順が含まれないものになります。 その結果、あなたのアプリケーションへ正しく統合出来ない可能性があります。

Gitリポジトリが、あなたが添付したGem用の.gemspecファイルを持ち、バージョン指定子が提供されている場合、 Gitリポジトリは.gemspecが指定するバージョン指定子にマッチする場合にのみ有効になることを意味します。(翻訳に自信なし) そうでなければ、Bundlerは警告を出力します。

gem "rails", "2.3.8", :git => "git://github.com/rails/rails.git"
# bundle install will fail, because the .gemspec in the rails
# repository's master branch specifies version 3.0.0

もしGitリポジトリが、あなたが添付するGemのための.gemspecを持たない場合、 バージョン指定子は提供されなければいけません。 Bundlerは単純に.gemspecそのバージョンを使用し、それを作成します。

Gitリポジトリは多くの追加オプションをサポートします。

オプション 説明
branch、
tag、
ref
これらのオプションのいずれか1つが指定しなければいけません。 デフォルトは、:branch => "master"です。
submodules :submodules => trueの指定は、 Bundlerに対して、Gitリポジトリに含まれるサブモジュールの拡張が行われます。

もし、Gitリポジトリが複数の.gemspecを含む場合、 各.gemspecは、ファイルシステム内の同じ場所に配置されているgemの.gemspecになります。

|~rails                   [git root]
| |-rails.gemspec         [rails gem located here]
|~actionpack
| |-actionpack.gemspec    [actionpack gem located here]
|~activesupport
| |-activesupport.gemspec [activesupport gem located here]
|...

Gitリポジトリ内に置かれているGemをインストールするために、 Bundlerはgemspecを含むディレクトリへの変更、gem build name.gemspecの実行、 そしてその結果のGemのインストールを行います。 Rubygemsに標準で付属するgem buildコマンドは、 それが置かれているディレクトリのコンテキスト内で.gemspecを評価します。

GitHub (:github)

もし、GitHubにホストされ公開されているGitリポジトリを使用したいのであれば、 :githubの略記を使用して、 GitHubのユーザー名とリポジトリ名(末尾の".git"無しで)だけをスラッシュ区切りで指定して使用することが出来ます。 もし、ユーザー名とリポジトリ名が同じであれば、片方を省くことが出来ます。

gem "rails", :github => "rails/rails"
gem "rails", :github => "rails"

上記のどちらも、下記と同じように評価されます。

gem "rails", :git => "git://github.com/rails/rails.git"

更に必要とするのであれば、特定のブランチを選択することも可能です。

gem "rails", :github => "rails/rails", :branch => "branch_name"
パス (:path)

ファイルシステム上の特定の場所に置かれたGemを指定することが可能です。 相対パスは、Gemfileに含まれるディレクトリから相対的に解決されます。

:gitオプションの意味付けと同様、 :pathオプションは、そのディレクトリにGemのための.gemspecが含まれるか、 またはBundlerが使用するべき明確なバージョンが指定されているか、どちらかの問いを必要とします。

:gitとは異なり、Bundlerはパスとして指定されたGemのために、C拡張をコンパイルしません。

gem "rails", :path => "vendor/rails"

source、git、path、group、platformsのブロック

:source:git:path:group:platformsのオプションは、 ブロック書式を使用してGemをグループ化することが可能です。

source "https://gems.example.com" do
  gem "some_internal_gem"
  gem "another_internal_gem"
end

git "git://github.com/rails/rails.git" do
  gem "activesupport"
  gem "actionpack"
end

platforms :ruby do
  gem "ruby-debug"
  gem "sqlite3"
end

group :development do
  gem "wirble"
  gem "faker"
end

gemspec (#gemspec)

もし、開発中のGemの依存性のインストールを手助けするのにBundlerを使用したいのであれば、 .gemspecファイルに挙げられている依存性を取り込むgemspecメソッドを使用して下さい。

gemspecメソッドは、デフォルトのグループで必要とされるGemとして、実行時の依存性を追加します。 また、developmentグループ内で必要とされるGemとして、開発(development)用の依存性の追加も行います。 最終的には、プロジェクト(:path => '.')に必要とされるGemを追加します。 Bundler.setupと併せて、プロジェクトがGemとしてインストールされたかのように、 テストコード内のプロジェクトファイルをrequireすることが可能になります。 手動による読み込みパス(load path)の操作、または相対パスを通してのプロジェクトファイルのrequireは必要ありません。

gemspecメソッドは、 任意の:path:name:development_groupのオプションをサポートし、 それぞれBundlerが.gemspecを探す場所、使用される.gemspecの名前(1つ以上提供されれば)、 どのグループの開発(development)依存性が含まれるかを制御します。(翻訳に自信なし)

sourceの優先度

Gemの要件を満たすためにGemの場所が検索される際に、Bundlerは下記の優先度に従います。

  1. Gemに対して明示的に割り当てられたsource(供給元) - (:source:path:gitを使用して)
  2. 暗黙的なGem(明示的に指定されたGemの依存性)の場合は、親で宣言された供給元(source)、Git(git)、パス(path)のリポジトリ
    このBundlerの優先度による結果では、ActiveSupportのGemは、rubygems.orgよりもRailsのGitリポジトリからのものが優先されます。(翻訳に自信なし)
  3. グローバルなsource行を通して指定された供給元(source)
    Gemfile内で指定された各sourceを最初から最後まで検索します。

 Back to top

© 2010 - 2017 STUDIO KINGDOM