bundle-install
- Gemfileに指定された依存関係をインストールします
bundle install
[--binstubs[=DIRECTORY]]
[--clean]
[--deployment]
[--frozen]
[--full-index]
[--gemfile=GEMFILE]
[--jobs=NUMBER]
[--local]
[--no-cache]
[--no-prune]
[--path PATH]
[--prefer-local]
[--quiet]
[--redownload]
[--retry=NUMBER]
[--shebang]
[--standalone[=GROUP[ GROUP...]]]
[--system]
[--trust-policy=POLICY]
[--with=GROUP[ GROUP...]]
[--without=GROUP[ GROUP...]]
Gemfile(Gemfile(5))に指定されたgemをインストールします。初めてbundle install
を実行する場合(Gemfile.lock
が存在しない場合)、Bundlerはすべてのリモートソースを取得し、依存関係を解決して、必要なすべてのgemをインストールします。
Gemfile.lock
が存在し、Gemfile(5)を更新していない場合、Bundlerはすべてのリモートソースを取得しますが、依存関係の解決にはGemfile.lock
に指定された依存関係を使用します。
Gemfile.lock
が存在し、Gemfile(5)を更新した場合、Bundlerは更新していないgemについてはGemfile.lock
の依存関係を使用しますが、更新したgemの依存関係は再解決します。この更新プロセスに関する詳細については、下記のCONSERVATIVE UPDATINGを参照してください。
--clean
、--deployment
、--frozen
、--no-prune
、--path
、--shebang
、--system
、--without
、--with
オプションは非推奨です。これらのオプションは、後続のすべてのbundle install
実行に自動的に適用される場合にのみ意味があり、そのためにはbundler
がそれらを暗黙的に記憶する必要があります。将来のバージョンのbundler
ではCLIフラグを記憶しなくなるため、永続的に適用するにはbundle config
(bundle-config(1)を参照)を使用する必要があります。
--binstubs[=<directory>]
bin/
に配置します。これにより、アプリケーション内のビンスタブを、アプリケーションに必要なgemの正確なバージョンにリンクできます。(デフォルトは~/bin
)ディレクトリを作成し、gemの実行可能ファイルをそこに配置します。これらの実行可能ファイルは、Bundlerのコンテキストで実行されます。使用する場合、このディレクトリを環境のPATH
変数に追加する必要があるかもしれません。例えば、rails
gemにrails
実行可能ファイルが含まれている場合、このフラグはbin/rails
実行可能ファイルを作成し、参照されるすべての依存関係がバンドルされたgemを使用して解決されるようにします。
--clean
このオプションは、clean
設定に置き換えられました。
--deployment
このオプションは、deployment
設定に置き換えられました。
--redownload
--frozen
このオプションは、frozen
設定に置き換えられました。
--full-index
--gemfile=<gemfile>
Gemfile.lock
とvendor/cache
を探します。--jobs=[<number>]
、-j[<number>]
--local
rubygems.org
への接続を試みません。代わりに、BundlerはRubygemsのキャッシュまたはvendor/cache
に既に存在するgemを使用します。適切なプラットフォーム固有のgemがrubygems.org
に存在する場合、見つからないことに注意してください。--prefer-local
vendor/cache
に既に存在するgemを強制的に使用します。リモートで新しいバージョンが利用可能な場合でも同様です。ローカルに存在しないgemについては、rubygems.org
への接続のみ試みます。--no-cache
vendor/cache
のキャッシュを更新しません。キャッシュ内のgemは削除されませんが、新しくバンドルされたgemはインストール中にキャッシュされません。--no-prune
このオプションは、no_prune
設定に置き換えられました。
--path=<path>
gem install ...
もgemをそこにインストールします。したがって、--path ...
設定なしでインストールされたgemは、gem list
を呼び出すことで表示されます。それに応じて、他の場所にインストールされたgemは一覧表示されません。このオプションは、path
設定に置き換えられました。
--quiet
$?
)を使用して終了します。--retry=[<number>]
--shebang=<ruby-executable>
--binstubs
で作成されたスクリプトを実行するために、指定されたruby実行可能ファイル(通常はruby
)を使用します。さらに、--binstubs
と--shebang jruby
を一緒に使用すると、これらの実行可能ファイルはjruby
を実行するように変更されます。このオプションは、shebang
設定に置き換えられました。
--standalone[=<list>]
bundle
という名前のディレクトリを作成し、そこにバンドルをインストールします。また、Bundler独自のセットアップを必要な方法で置き換えるbundle/bundler/setup.rb
ファイルも生成します。このオプションを使用すると、暗黙的にpath
が設定されます。これは[記憶されたオプション][REMEMBERED OPTIONS]です。--system
--path
の設定が上書きされます。このオプションは、system
設定に置き換えられました。
--trust-policy=[<policy>]
HighSecurity
、MediumSecurity
、LowSecurity
、AlmostNoSecurity
、NoSecurity
のいずれかです。詳細については、下記のSEE ALSOにあるRubygems署名ドキュメントを参照してください。--with=<list>
--without
に与えられたグループが記憶されているグループのリストにある場合、そのリストから削除されます。このオプションは、with
設定に置き換えられました。
--without=<list>
--with
に与えられたグループが記憶されているグループのリストにある場合、そのリストから削除されます。このオプションは、without
設定に置き換えられました。
Bundlerのデフォルトは開発用に最適化されています。デプロイメントとCI用に最適化されたデフォルトに切り替えるには、--deployment
フラグを使用します。開発マシンではデプロイメントモードを有効にしないでください。 Gemfile(5)が変更されるとエラーが発生します。
Gemfile.lock
が必要です。
開発時とテストで使用したgemの同じバージョンをデプロイメントでも使用するには、Gemfile.lock
が必要です。
これは主に、Gemfile.lock
をバージョン管理にチェックインすることを忘れないようにするためです。
Gemfile.lock
は最新である必要があります
開発では、Gemfile(5)を変更し、bundle install
を再実行して、Gemfile.lock
のスナップショットを保守的に更新できます。
デプロイメントでは、Gemfile.lock
はGemfile(5)で行われた変更と最新である必要があります。
gemは、デフォルトのシステムの場所ではなくvendor/bundle
にインストールされます
開発では、アプリケーションで使用されるgemを他のアプリケーションやシステムで実行される他のスクリプトと共有すると便利です。
デプロイメントでは、分離がより重要なデフォルトです。さらに、アプリケーションをデプロイするユーザーがシステムにgemをインストールする権限を持っていない場合、またはWebサーバーがgemを読み取る権限を持っていない場合があります。
その結果、bundle install --deployment
は、アプリケーションのvendor/bundle
ディレクトリにgemをインストールします。これは--path
オプションを使用して上書きできます。
デフォルトでは、bundle install
はGemfile(5)のすべてのグループのすべてのgemをインストールしますが、異なるプラットフォーム用に宣言されたgemを除きます。
ただし、--without
オプションを使用して、特定のグループのインストールをスキップするようにBundlerに明示的に指示できます。このオプションは、スペースで区切られたグループのリストを取ります。
--without
オプションは指定されたグループのgemのインストールをスキップしますが、それらのgemをダウンロードし、Gemfile(5)のすべてのgemの依存関係を解決するために使用します。
これは、別のマシン(本番サーバーなど)で異なるグループのセットをインストールしても、既に開発およびテスト済みのgemとバージョンが変更されないようにするためです。
Bundlerは、開発とテストで実行しているサードパーティのコードが、本番でも実行しているサードパーティのコードと確実に一致することを保証します。異なる環境で一部のコードを除外することはできますが、異なる環境で異なるバージョンのサードパーティコードが使用されるという事態には決してなりません。
簡単な例として、次のGemfile(5)を考えてみましょう。
source 'https://rubygems.org'
gem 'sinatra'
group :production do
gem 'rack-perftools-profiler'
end
この場合、sinatra
はRackの任意のバージョン(>= 1.0
)に依存し、rack-perftools-profiler
は1.x(~> 1.0
)に依存します。
開発環境でbundle install --without production
を実行すると、rack-perftools-profiler
の依存関係も考慮されます。これにより、Rack 2.0に対応した新しいAPIを使って開発を進め、Rack 1.xでは利用できない機能を利用したにも関わらず、production
グループが使用された際にBundlerがRack 1.2に切り替わる、といった事態を防ぎます。
実際には、除外されたグループのgemをインストールしようとはしないため、依存関係の解決プロセスの一環として評価するのみであり、問題が発生することはありません。
これはまた、同じgemの異なるバージョンを異なるグループに含めることができないことを意味します。なぜなら、そうすると開発環境と本番環境で異なる依存関係セットが使用されることになるからです。依存関係の解決プロセスの複雑さから、これは通常、GemfileGemfile(5)にリストされているgem以上に影響し、(驚くべきことに)使用しているgemを根本的に変更する可能性があります。
bundle install
を実行すると、Bundlerは使用したすべてのgemの完全な名前とバージョン(GemfileGemfile(5)に指定されたgemの依存関係を含む)をGemfile.lock
というファイルに保存します。
Bundlerは、後続のbundle install
呼び出しでこのファイルを使用します。これにより、アプリケーションがマシン間を移動しても、常に同じコードを使用することが保証されます。
依存関係の解決方法のため、一見小さな変更(たとえば、GemfileGemfile(5)のgemの依存関係のポイントリリースの更新)でも、すべての依存関係を満たすために必要なgemが根本的に異なる場合があります。
その結果、アプリケーションとgemの両方でGemfile.lock
をバージョン管理システムにコミットする必要があります。 そうしないと、リポジトリをチェックアウトするすべてのマシン(本番サーバーを含む)がすべての依存関係を再度解決し、GemfileGemfile(5)のgemまたはその依存関係のいずれかが更新されている場合、異なるバージョンのサードパーティコードが使用されることになります。
Bundlerが最初にリリースされたとき、Gemfile.lock
は生成されたgemに含まれる.gitignore
ファイルに含まれていました。しかし、時間の経過とともに、この方法では依存関係の破損の問題が新しい貢献者に押し付けられ、既存の貢献者はその問題に気付かない可能性があることが明らかになりました。bundle install
は通常、貢献への最初のステップであるため、依存関係の破損の問題は、新しい貢献者が貢献することを妨げます。そのため、gem作成者向けのガイドラインを改訂し、gemのlockファイルをコミットすることを推奨しています。
GemfileGemfile(5)に変更を加えてからbundle install
を実行すると、Bundlerは変更したgemのみを更新します。
言い換えれば、bundle install
を呼び出す前に変更しなかった
gemが動作していた場合、更新後も以前と同じ依存関係のバージョンを引き続き使用します。
例を見てみましょう。元のGemfileGemfile(5)は次のとおりです。
source 'https://rubygems.org'
gem 'actionpack', '2.3.8'
gem 'activemerchant'
この場合、actionpack
とactivemerchant
の両方がactivesupport
に依存しています。actionpack
gemはactivesupport 2.3.8
とrack ~> 1.1.0
に依存し、activemerchant
gemはactivesupport >= 2.3.2
、braintree >= 2.0.0
、builder >= 2.0.0
に依存しています。
依存関係が最初に解決されると、BundlerはGemfileGemfile(5)の両方のgemの要件を満たすactivesupport 2.3.8
を選択します。
次に、GemfileGemfile(5)を次のように変更します。
source 'https://rubygems.org'
gem 'actionpack', '3.0.0.rc'
gem 'activemerchant'
actionpack 3.0.0.rc
gemには多くの新しい依存関係があり、activesupport
の依存関係を= 3.0.0.rc
に、rack
の依存関係を~> 1.2.1
に更新します。
bundle install
を実行すると、Bundlerはactionpack
gemを変更したが、activemerchant
gemは変更していないことに気付きます。Bundlerは、その要件を満たすために現在使用されているgemを評価します。
activesupport 2.3.8
activemerchant
の依存関係を満たすためにも使用されています。rack ~> 1.1.0
activemerchant
を明示的に更新するように要求していないため、actionpack
を更新した後に突然動作しなくなることは期待しません。しかし、actionpackの新しいactivesupport 3.0.0.rc
依存関係を満たすには、その依存関係の1つを更新する必要があります。
activemerchant
は理論的にはactivesupport 3.0.0.rc
に一致する非常に緩い依存関係を宣言していますが、Bundlerは変更されていないGemfileGemfile(5)のgemとその依存関係をアトミック単位として扱います。この場合、activemerchant
の依存関係はactivemerchant 1.7.1 + activesupport 2.3.8
として扱われるため、bundle install
はactionpack
を更新できないと報告します。
actionpack
を明示的に更新するには、GemfileGemfile(5)の他のgemがまだ依存している依存関係を含めて、bundle update actionpack
を実行します(bundle update(1)
を参照)。
要約
:一般的に、GemfileGemfile(5)に変更を加えた後は、最初にbundle install
を実行して、GemfileGemfile(5)の他のgemが変更の影響を受けないことを確認してください。それが機能しない場合は、bundle update(1)を実行します。