【问题标题】:How does Bundler decipher which commit corresponds to a certain Gem version?Bundler 如何破译哪个提交对应于某个 Gem 版本?
【发布时间】:2012-08-19 11:17:36
【问题描述】:

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

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

所以看起来 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 是这样做的),那么如果该分支上有后续提交(但版本保持不变),这是否意味着我会有不同的版本那个 Gem 比在我之后捆绑的人(在分支上的后续提交之后)?

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

感谢您的宝贵时间!

【问题讨论】:

    标签: github gem version bundler rubyforge


    【解决方案1】:

    当一个 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 中列出的任何提交。

    【讨论】:

    • @steveh512 哇...我不知道.gem 文件。这是完全有道理的。谢谢你的信息。
    猜你喜欢
    • 1970-01-01
    • 2021-01-25
    • 2012-05-09
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多