1

私はBundlerのページとRubyGemのページ(およびSOの投稿)を調査してきましたが、これを理解できないようです。

Gemfileで、使用するGemのバージョンをBundlerに指定します。それが私が真実だと知っていることのすべてです...残りは私が舞台裏で何が起こっているかを推測することです。

したがって、BundlerはRubyGems.orgまたはその他のソースにアクセスして、Gemのバージョン、依存関係、およびソースファイルの場所を把握しているように見えます。これが私の大きな前提です。

次に、おそらくBundlerはコードリポジトリ(おそらくGithub)にアクセスして、ソースコードをダウンロードします。これは私が立ち往生しているところです。誰かが1.0.0のバージョンを指定した場合、BundlerはどのGitコミットがバージョン1.0.0に対応するかをどのように知るのですか?

-Bundlerはタグで移動しますか?

-または、Bundlerはバージョン番号と同じ名前のブランチの先頭に移動しますか?

-または、RubyForgeのどこかに特定のコミットが指定されていますか?

-または、ソースコードのスナップショットをRubyForgeから直接入手できますか?

Gemを1.0.0に指定してバンドルインストールを実行すると、疑問に思います。Bundleは1.0.0ブランチの先頭でコミットを取得し(それがBundlerの方法である場合)、そのブランチで後続のコミットがある場合(ただし、バージョンは同じままです)、それは私が異なるバージョンを持っていることを意味しますその宝石は、私の後にバンドルする人よりも(ブランチでの後続のコミットの後)?

バンドラーがバージョンを特定のコミットに解決することは理にかなっていますが、バンドラーはどのようにコミットを選択しますか?バージョン1.0.0は複数のコミットにまたがって存在する可能性があるためです。

お時間をいただきありがとうございます!

4

1 に答える 1

0

gemがRubyGems.orgにアップロードされると、コードはgemspecとともに.gemファイル(基本的には.zipまたは.tar.gzファイルのようなアーカイブ)にパッケージ化されます。次に、RubyGems.orgはgemspecを解凍し、それを読み取ってバージョン情報などを取得します。

Bundlerでgemバージョンを指定すると、RubyGems.orgでそのバージョンが利用可能かどうかを確認します。その場合、RubyGems.orgから直接.gemファイルをダウンロードして解凍します。すべてのコードは、.gemファイルに含まれているため、GitHubからダウンロードする必要はありません。RubyGems.orgに存在しないバージョンを指定すると、エラーが発生します。

BundlerがGitHubから何かをダウンロードするのは、バージョンを指定するgitか、バージョンを指定する場合のみですgithub。その場合、マスターブランチ(またはGemfileが指定するブランチ)の最新のコミット、またはGemfile.lockが存在する場合は、Gemfile.lockにリストされているコミットのいずれかをダウンロードします。

于 2012-08-24T08:18:27.290 に答える