bundle install
コマンドを実行すると、 'Gemfile.lock'が作業ディレクトリに作成されます。そのファイル内のディレクティブはどういう意味ですか?
たとえば、次のファイルを見てみましょう。
PATH
remote: .
specs:
gem_one (0.0.1)
GEM
remote: http://example.org/
specs:
gem_two (0.0.2)
gem_three (0.0.3)
gem_four (0.0.4)
PLATFORMS
platform
DEPENDENCIES
gem_two
gem_one!
'PATH'、 'GEM'、 「プラットフォーム」および「依存関係」について説明しますか?それらはすべて必要ですか?
「remote」および「specs」サブディレクティブを含めるべきものは何ですか?
'DEPENDECIES'グループの宝石名の後の感嘆符は何を意味しますか?
詳細については bundler website (便宜のために以下に強調を追加)で見つけることができます:
しばらくアプリケーションを開発した後、GemfileおよびGemfile.lockスナップショットとともにアプリケーションをチェックインします。これで、リポジトリには、アプリケーションが機能したことを確認した最後に使用したすべてのgemの正確なバージョンの記録があります...
これは重要です:Gemfile.lockを使用すると、アプリケーションは、独自のコードと最後に実行したサードパーティコードの両方の単一パッケージになります確実にすべてが機能しました。 Gemfileで依存するサードパーティコードの正確なバージョンを指定しても、同じ保証は提供されません。gemは通常、依存関係のバージョンの範囲を宣言するためです。
感嘆符に関しては、:git
を介して取得したgemにあることがわかりました。
gem "foo", :git => "[email protected]:company/foo.git"
自動化された依存関係更新ツールを構築しながら、私は過去数ヶ月間GemfilesとGemfile.locksをいじくり回しました1。以下は決定的なものではありませんが、Gemfile.lock形式を理解するための良い出発点です。 Bundlerの lockfile parser のソースコードをチェックアウトすることもできます。
Bundler 1.xによって生成されたロックファイルには、次の見出しがあります。
GEM(オプションだが非常に一般的)
これらは、Rubygemsサーバーをソースとする依存関係です。これは、Rubygems.orgのメインのRubygemsインデックスである場合もあれば、Gemfuryなどから入手可能なカスタムインデックスである場合もあります。このセクションには以下が表示されます。
remote:
Rubygemsインデックスの場所を指定する1つ以上の行specs:
依存関係のリスト、バージョン番号、および下位依存関係の制約GIT(オプション)
これらは、特定のgitリモートから提供される依存関係です。 gitリモートごとにこれらのセクションの異なるセクションが表示され、各セクション内に表示されます:
remote:
gitリモート。例:[email protected]:Rails/rails
revision:
Gemfile.lockがロックされているコミット参照tag:
(オプション)Gemfileで指定されたタグspecs:
このリモートで見つかったgit依存関係、バージョン番号、および下位依存関係の制約PATH(オプション)
これらは、Gemfileで提供される特定のpath
をソースとする依存関係です。パスの依存関係ごとにこれらのセクションの異なるセクションが表示され、各セクション内に表示されます。
remote:
パス。例:plugins/vendored-dependency
specs:
このリモートで見つかったgit依存関係、バージョン番号、および下位依存関係の制約プラットフォーム
Gemfile.lockが生成されたRubyプラットフォーム。 Gemfileの依存関係がプラットフォームを指定している場合、そのプラットフォームでロックファイルが生成されるとき(インストールなど)にのみGemfile.lockに含まれます。
依存関係
Gemfile
で指定されている依存関係のリストと、そこに指定されているバージョン制約。
メインのRubygemsインデックス以外のソースで指定された依存関係(たとえば、git依存関係、パスベースの依存関係)には!
があります。つまり、そのソースに「固定」されています2 (ただし、Gemfileを調べて確認する必要がある場合もあります)。
Ruby VERSION(オプション)
このGemfile.lockが作成されたときにGemfileで指定されたRubyバージョン。代わりにRubyバージョンが.Ruby_version
ファイルに指定されている場合、このセクションは存在しません(BundlerはGemfile/Gemfile.lockをインストーラーのRubyバージョンに依存しないと見なすため) )。
BUNDLED WITH(Bundler> = v1.10.x)
Gemfile.lockの作成に使用されたBundlerのバージョン。ファイルを作成したバージョンよりも古い場合、Bundlerのバージョンを更新するようインストーラーに通知するために使用されます。
PLUGIN SOURCE(オプションで非常にまれ)
理論的には、GemfileはBundlerプラグインとgemを指定できます3、ここにリストされます。実際には、2017年7月現在、利用可能なプラグインを知りません。Bundlerのこの部分はまだ活発に開発中です!
PATHはgemspecから直接第1世代の依存関係をリストするのに対し、GEMは第2世代の依存関係(つまり、依存関係が依存するもの)とGemfileからの依存関係をリストするように見えます。 PATH :: remoteは.
です。これは、PATH :: specに属するものを見つけるために現在のディレクトリのローカルgemspecに依存していたためです。一方、GEM :: remoteはrubygems.org
ですGEM :: specに属するものを調べてください。
RailsプラグインにはPATHセクションが表示されますが、Railsアプリには表示されません。アプリにはgemspecファイルがないため、PATHに追加するものは何もありません。
依存関係については、 gembundler.com の状態:
Runtime dependencies in your gemspec are treated like base dependencies,
and development dependencies are added by default to the group, :development
Rails plugin new my_plugin
によって生成されたGemfileは、同様のことを言っています:
# Bundler will treat runtime dependencies like base dependencies, and
# development dependencies will be added by default to the :development group.
これが意味することは、
s.add_development_dependency "july" # (1)
そして
s.add_dependency "july" # (2)
(1)開発環境のGemfile.lock(およびアプリケーション)に「july」のみを含めることです。したがって、bundle install
を実行すると、PATHの下だけでなくDEPENDENCIESの下でも、開発中にのみ「july」が表示されます。本番環境では、まったく存在しません。ただし、(2)を使用すると、依存関係ではなくPATHにのみ「july」が表示されますが、実稼働環境からbundle install
(つまり、依存関係)、開発だけではありません。
これらは私の観察に過ぎず、なぜこれがそうなのかを完全に説明することはできませんが、さらなるコメントを歓迎します。
Bundlerは、必要なgemとバージョンを正確に追跡およびインストールすることにより、Rubyプロジェクトに一貫した環境を提供するGemマネージャーです。
GemfileとGemfile.lockは、Bundler gemによって提供される主要な製品です(Bundler自体はgemです)。
Gemfileには、指定したバージョンで手動で言及したgemへのプロジェクトの依存関係が含まれていますが、これらのgemは、バンドラーによって自動的に解決される他のgemに依存します。
Gemfile.lockには、Gemfile内のすべてのgemの完全なスナップショットと、関連する依存関係が含まれています。
最初に bundle install を呼び出すと、このGemfile.lockが作成され、以降のすべての呼び出しでこのファイルが使用されてバンドルインストールが行われます。これにより、すべての依存関係がインストールされ、依存関係のインストールがスキップされます。
同じマシンでコードを共有するときに同じことが起こります
Gemfileと一緒にGemfile.lockを共有します。他のマシンでバンドルインストールを実行すると、Gemfile.lockが参照され、依存関係の解決手順がスキップされます。代わりに、使用したのと同じ依存gemがすべてインストールされます。 複数のマシン間で一貫性を維持する元のマシン
複数のマシンで一貫性を維持する必要があるのはなぜですか?
異なるマシンで異なるバージョンを実行すると、コードが破損する可能性があります
アプリでバージョン1.5.3を使用し、14か月前に動作するとします
問題なく、別のマシンにインストールしようとしています
Gemfile.lockを使用しないと、バージョン1.5.8が得られます。一部のgemの最新バージョンでは壊れている可能性があり、アプリケーションは
不合格。一貫性を維持することが最も重要です(推奨
練習)。
bundle update を使用してGemfile.lockのgemを更新することもできます。
これは、 保守的な更新 の概念に基づいています
Gemfile.lock
形式で話している明確な文書はないようです。たぶん、Gemfile.lock
が内部でバンドルによって使用されているためです。
ただし、Gemfile.lock
はGemfile
のスナップショットであるため、すべての情報はGemfile
から(またはGemfile
で指定されていない場合はデフォルト値から)取得する必要があります。
GEM
の場合、Gemfile
で直接または間接的に導入するすべての依存関係がリストされます。 remote
の下のGEM
は、Gemfile
の- source で指定されたgemを取得する場所を示します。
Gemがremote
から取得されない場合、PATH
は場所を見つけてそれを見つけます。 PATH
の情報は、依存関係を宣言するときにGemfile
の- path から取得されます。
そして、PLATFORM
は here からのものです。
DEPENDENCIES
の場合、バンドルによって解決される依存関係のスナップショットです。
「 https://rubygems.org 」以外のソースを使用してgemがインストールされたときに、感嘆符が表示されます。
.