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



What Is Difference Between Gemfile



解決:

NSGemfileは、使用するgemを指定する場所であり、バージョンを指定できます。

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



Bundlerの目的と理論的根拠、特にコードをバージョン管理にチェックインするセクションを確認してください。


通常、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 。つまり、ビルドしようとすると、bundleがバージョンをインストールします 1.4.9 のこぎりのGemfile.lock)。

どういう意味ですか ?

あなたが持っていないかどうかを見るようにGemfile.lockと実行:



バンドルインストール

それから 現在使用されている宝石はいつでも異なる可能性があります 。あなたのアプリはバージョンを使用しました 1.4.4 そしてそれは機能します 8ヶ月前 問題なく、しかしあなたがそれを構築しようとすると あなたはバージョンを取得します 1.4.9 。多分それはの最新バージョンで壊れていますnokogiri、あなたが使った素晴らしい機能 1.4.4 これ以上利用できないなど。

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

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

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

バンドルインストール

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

Gemfile.lockを更新する方法は?

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

バンドルインストール

これはあなたを更新しますGemfile.lockと最新バージョンのアプリ。


Gemfile.lock

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

Bundlerは、バンドルインストールへの後続のすべての呼び出しでこのファイルを使用します。これにより、アプリケーションがマシン間を移動する場合でも、常に同じ正確なコードを使用することが保証されます。

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

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