回答:
ここでGemfile
は、使用するgemを指定し、どのバージョンを指定するかを指定します。
このGemfile.lock
ファイルは、Bundlerがインストールされた正確なバージョンを記録する場所です。このようにして、同じライブラリ/プロジェクトが別のマシンにロードされた場合、を使用して最新バージョンをインストールするのではなくbundle install
、Gemfile.lock
を実行してまったく同じバージョンGemfile
をインストールします。(異なるマシンで異なるバージョンを実行すると、テストが失敗する可能性があります。)ロックファイルを直接編集する必要はありません。
チェックアウトバンドラーの目的及び理由を具体的にバージョン管理セクションにあなたのコードを確認します。
通常、Gemfileの依存関係は次のように記述します。
gem "nokogiri", "~> 1.4.4"
gem 'bcrypt-ruby', '~> 3.0.0'
gem 'uglifier', '>= 1.2.3'
..
ここでは基本的に、「バージョン1.4.4よりも大きい限りのこぎりが欲しい」などと言います。ここで、Gemfile
8か月前にセットアップし、この要件でアプリを正常にセットアップしたとします。8か月前のこぎりバージョンは1.4.4でした。このバージョンでは、私のRailsアプリは問題なく完全に実行されていました。
今、私は同じで構築しようとしていると思いますGemfile
。しかし、nokogiriのバージョンを見ると、現在の安定バージョンが1.4.9に変更されていることがわかります。つまり、ビルドしようとすると、bundlerはバージョン1.4.9のnokogiri をインストールします(Gemfile.lock
)。
何もない場合は、次のようにGemfile.lock
実行します。
bundle install
その場合、現在使用されている宝石はいつでも異なる可能性があります。アプリはバージョン1.4.4を使用し、8か月前は問題なく動作しましたが、今すぐビルドしようとすると、バージョン1.4.9が取得されます。たぶん、最新バージョンので壊れているかもしれません。1.4.4でnokogiri
使用した素晴らしい機能はもう利用できません。
この種の問題を防ぐためにGemfile.lock
使用されます。でGemfile.lock
唯一の正確なバージョンが書かれているので、これらのみがインストールされます。つまり、アプリをで配布するとGemfile.lock
、すべてのマシンに同じgemがインストールされ、最も重要なのはすべて同じバージョンを取得することです。これにより、安定した共通のデプロイメントスタックが得られます。
最初のもので自動的に作成されます:
bundle install
コマンド。その後、を実行するたびにbundle install
、バンドルは最初にGemfile.lock
そこで指定されたgemを検索してインストールします。一貫性と安定性を提供するために、プロジェクト間でこのファイルを配布するのが習慣です。
アプリの最新バージョンに満足している場合は、更新できますGemfile.lock
。への変更を反映するだけGemfile
です。つまり、依存関係をの新しい正確なバージョンに変更しGemfile
ます。その実行後:
bundle install
これGemfile.lock
により、最新バージョンのアプリで更新されます。
gem "nokogiri", "~> 1.4.4"
、gemfileでを使用して特定のバージョンを既に指定していることです。なぜバンドラーはそのバージョンを使用できないのですか?デフォルトで最新バージョンのgemを意図的にインストールするように設計されているためですか?
~> 1.4.4
同等>= 1.4.4 and < 1.5
です。bundler.io/v1.5/gemfile.htmlを参照してください。正確なバージョンについては、を使用してくださいgem 'foo', '1.4.4'
。
bundle install
チェックしGemfile
て、Gemfile.lock
新しい制限を適用すると言っていますGemfile.lock
か?
Gemfile.lock
bundle installを実行すると、Bundlerは、使用したすべてのgemの完全な名前とバージョン(Gemfile(5)で指定されたgemの依存関係を含む)をGemfile.lockというファイルに永続化します。
Bundlerは、以降のすべての呼び出しでこのファイルを使用してbundle installを実行します。これにより、アプリケーションがマシン間を移動する場合でも、常にまったく同じコードを使用することが保証されます。
依存関係の解決方法が原因で、一見小さな変更(たとえば、Gemfile(5)のgemの依存関係のポイントリリースへの更新)でも、すべての依存関係を満たすために根本的に異なるgemが必要になる場合があります。
その結果、バージョンコントロールにGemfile.lockをチェックする必要があります。そうしないと、リポジトリをチェックアウトするすべてのマシン(本番サーバーを含む)がすべての依存関係を再度解決します。その結果、Gemfile(5)のいずれかのgemまたはそれらの依存関係の更新されました。
Gemfile.lock
いくつかのケースで「オープン」バージョンが含まれています(例えばrails (4.0.0)
必要ですbundler (>= 1.3.0, < 2.0)
)、これは問題を引き起こします。これらの「オープン」な依存関係を回避する方法はありますか?