Ruby on RailsのGemfileとGemfile.lockの違いは何ですか


回答:


159

ここでGemfileは、使用するgemを指定し、どのバージョンを指定するかを指定します。

このGemfile.lockファイルは、Bundlerがインストールされた正確なバージョンを記録する場所です。このようにして、同じライブラリ/プロジェクトが別のマシンにロードされた場合、を使用して最新バージョンをインストールするのではなくbundle installGemfile.lockを実行してまったく同じバージョンGemfileをインストールします。(異なるマシンで異なるバージョンを実行すると、テストが失敗する可能性があります。)ロックファイルを直接編集する必要はありません。

チェックアウトバンドラーの目的及び理由を具体的にバージョン管理セクションにあなたのコードを確認します。


2
ことは、それがどのようにのすべき仕事-しかし、明らかにGemfile.lockいくつかのケースで「オープン」バージョンが含まれています(例えばrails (4.0.0)必要ですbundler (>= 1.3.0, < 2.0))、これは問題を引き起こします。これらの「オープン」な依存関係を回避する方法はありますか?
Guillermo Grau 14

158

通常、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.4nokogiri使用した素晴らしい機能はもう利用できません。

この種の問題を防ぐためにGemfile.lock使用されます。でGemfile.lock唯一の正確なバージョンが書かれているので、これらのみがインストールされます。つまり、アプリをで配布するとGemfile.lock、すべてのマシンに同じgemがインストールされ、最も重要なのはすべて同じバージョンを取得することです。これにより、安定した共通のデプロイメントスタックが得られます。

Gemfile.lockはどのように作成されますか?

最初のもので自動的に作成されます:

bundle install

コマンド。その後、を実行するたびにbundle install、バンドルは最初にGemfile.lockそこで指定されたgemを検索してインストールします。一貫性と安定性を提供するために、プロジェクト間でこのファイルを配布するのが習慣です。

Gemfile.lockを更新する方法

アプリの最新バージョンに満足している場合は、更新できますGemfile.lock。への変更を反映するだけGemfileです。つまり、依存関係をの新しい正確なバージョンに変更しGemfileます。その実行後:

bundle install

これGemfile.lockにより、最新バージョンのアプリで更新されます。


19
非常に素晴らしく、明確な説明(私は賛成票を投じました)。ただし、1つのnitpickをインストールすることnokogiri ~> 1.4.4はできません1.5.3。許可される最大値は1.4.xどこかですx>=4(のこぎりの場合は1.4.7)。~>オペレータ手段は、ちょうど最後の桁に使用される宝石では、指定されたバージョン「より大きい」ことができます。たとえば、がabc {something}であり、{something} d である限り、foo ~> a.b.c.dどのバージョンでfooも問題ないことを意味します>=関連する質問
マイケル、2013

1
混乱しているのはgem "nokogiri", "~> 1.4.4"、gemfileでを使用して特定のバージョンを既に指定していることです。なぜバンドラーはそのバージョンを使用できないのですか?デフォルトで最新バージョンのgemを意図的にインストールするように設計されているためですか?
ジョニー

@ジョニー、マイケル_nのコメントを見てください。〜> 1.4.4は正確なバージョンを指定していません。
マシューFlaschen

2
@Jonnyはと~> 1.4.4同等>= 1.4.4 and < 1.5です。bundler.io/v1.5/gemfile.htmlを参照してください。正確なバージョンについては、を使用してくださいgem 'foo', '1.4.4'
マシューFlaschen

1
すばらしい回答ですが、「Gemfile.lockを更新しますか?」を明確にしてくださいこのセクションでは、新しい制限が存在する場合でもbundle installチェックしGemfileて、Gemfile.lock新しい制限を適用すると言っていますGemfile.lockか?
JMess 2017年

4

Gemfile.lock

bundle installを実行すると、Bundlerは、使用したすべてのgemの完全な名前とバージョン(Gemfile(5)で指定されたgemの依存関係を含む)をGemfile.lockというファイルに永続化します。

Bundlerは、以降のすべての呼び出しでこのファイルを使用してbundle installを実行します。これにより、アプリケーションがマシン間を移動する場合でも、常にまったく同じコードを使用することが保証されます。

依存関係の解決方法が原因で、一見小さな変更(たとえば、Gemfile(5)のgemの依存関係のポイントリリースへの更新)でも、すべての依存関係を満たすために根本的に異なるgemが必要になる場合があります。

その結果、バージョンコントロールにGemfile.lockをチェックする必要があります。そうしないと、リポジトリをチェックアウトするすべてのマシン(本番サーバーを含む)がすべての依存関係を再度解決します。その結果、Gemfile(5)のいずれかのgemまたはそれらの依存関係の更新されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.