2012-08-23 32 views
1

我一直在研究Bundler的页面和RubyGem的页面(和SO帖子),但似乎无法弄清楚。Bundler如何破译哪个提交对应某个Gem版本?

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

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

然后Bundler很可能会去代码库,最有可能的是Github,下载源代码。这是我坚持的地方。如果某人指定1.0.0的版本,Bundler如何知道哪个Git commit与版本1.0.0相对应?

-Bundes go by tags?

- 或Bundler是否将头部命名为与版本号相同的分支?

- 或者在RubyForge的某处指定了具体的提交吗?

- 或直接通过RubyForge的源代码的快照吗?

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

这将是有道理的,bundler解析版本为特定的提交,但bundler如何选择提交?因为版本1.0.0可以跨多个提交存在。

谢谢你的时间!

回答

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下载任何东西的唯一时间是如果您指定gitgithub而不是版本。在这种情况下,它将下载主分支中的最新提交(或Gemfile指定的任何分支),或者如果Gemfile.lock存在,则在Gemfile.lock中列出任何提交。

+0

@ steveh512哇...我不知道the.gem文件。这是完全合理的。谢谢你的信息。 –

相关问题