Bundler如何破译哪个提交对应于某个Gem版本?

时间:2012-08-23 21:19:05

标签: github gem version bundler rubyforge

我一直在研究Bundler的页面和RubyGem的页面(以及SO帖子),但似乎无法解决这个问题。

在Gemfile中,您指定Bundler使用哪个版本的Gem。这就是我所知道的真实......剩下的就是我在猜测幕后发生的事情。

所以看起来Bundler会去RubyGems.org或其他一些来源找出Gem的版本,依赖关系和源文件的位置。这是我的重要假设。

然后很可能Bundler会去代码库,很可能是Github,下载源代码。这是我被困在的地方。如果有人指定1.0.0的版本,Bundler如何知道哪个Git提交对应于版本1.0.0?

- Bundler是通过标签吗?

- Bundler是否会将一个名称与版本号相同的分支转到头部?

-Or是否在RubyForge的某处指定了特定的提交?

-Or是直接通过RubyForge提供的源代码的快照?

我想知道,因为如果我指定Gem为1.0.0并进行捆绑安装。 Bundle在1.0.0分支的头部进行提交(如果这是Bundler的工作方式),那么如果该分支上有后续提交(但版本保持不变),这是否意味着我将拥有不同的版本那个宝石比跟我捆绑的人(在随后的分支提交之后)?

捆绑器将版本解析为特定提交是有意义的,但是捆绑器如何选择提交?因为版本1.0.0可以存在于多个提交中。

感谢您的时间!

1 个答案:

答案 0 :(得分:0)

当gem上传到RubyGems.org时,代码与gemspec一起打包在.gem文件中(基本上是.zip或.tar.gz文件的存档)。然后RubyGems.org解压缩gemspec并读取它以获取版本信息等。

在Bundler中指定gem版本时,它会检查RubyGems.org以查看该版本是否可用。如果是这样,它直接从RubyGems.org下载.gem文件并解压缩它,所有代码都在.gem文件中,所以不需要从GitHub下载它。如果您指定RubyGems.org上不存在的版本,则会收到错误。

如果您指定gitgithub而不是版本,则Bundler从GitHub下载任何内容的唯一时间。在这种情况下,它将下载主分支中的最新提交(或Gemfile指定的任何分支),或者,如果Gemfile.lock存在,则下载Gemfile.lock中列出的任何提交。