1

我一直在研究 Bundler 的页面和 RubyGem 的页面(以及 SO 帖子),但似乎无法弄清楚这一点。

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

所以看起来 Bundler 会转到 RubyGems.org 或其他一些来源,以找出 Gem 的版本、依赖项和源文件的位置。这是我的大假设。

然后最有可能 Bundler 去代码存储库,最有可能是 Github,下载源代码。这就是我坚持的地方。如果有人指定 1.0.0 版本,Bundler 怎么知道哪个 Git 提交对应于 1.0.0 版本?

-Bundler 是否通过标签?

- 或者 Bundler 是否会转到与版本号命名相同的 head aa 分支?

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

- 或者直接通过 RubyForge 获得源代码的快照?

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

bundler 将版本解析为特定提交是有道理的,但是 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 下载任何内容的情况是您指定gitgithub代替版本。在这种情况下,它将下载 master 分支(或 Gemfile 指定的任何分支)中的最新提交,或者,如果 Gemfile.lock 存在,则下载 Gemfile.lock 中列出的任何提交。

于 2012-08-24T08:18:27.290 回答