首页 > 解决方案 > Gem.latest_version_for(name) 方法的奇怪结果

问题描述

我正在研究与 gem 相关的实用程序,并且使用 Gem.latest_version_for 方法观察到了奇怪的结果。以下是irb下的一些观察:

irb(main):001:0> Gem.latest_version_for('rails').to_s
=> "5.2.2"
irb(main):002:0> Gem.latest_version_for('gosu').to_s
=> "0.7.38"

请注意第一行如何获得正确版本的 rails, 5.2.2 我写这篇文章并与 ruby​​gems.org 检查确认了这一点。gosu gem 的查询返回 0.7.38,这是非常错误的。正确答案应该是 0.14.4

我无法解释这里发生了什么。

我可以确认我的主机是https://rubygems.org并且

C:\Sites\mysh
8 mysh>ruby --version
ruby 2.3.3p222 (2016-11-21 revision 56859) [i386-mingw32]
C:\Sites\mysh
9 mysh>gem --version
2.5.2

标签: rubyrubygems

解决方案


平台可用的最新版本i386-mingw32是 0.7.38。您会注意到这与您报告的 ruby​​ 版本一致。

https://rubygems.org/gems/gosu/versions

latest_version_for调用latest_spec_forGem::SpecFetcher.spec_for_dependency它只使用 gem 的名称作为参数进行调用。spec_for_dependency接受另一个参数,matching_platform默认为真。

它看起来像是latest_version_for通过该链限定在您当前的平台上,matching_platform默认值。该gem install命令可能会将 i386/x386 视为相同/等效并允许它们。

spec_for_dependency

if matching_platform is false, gems for all platforms are returned

您应该能够镜像该latest_spec_for方法并传入multi_platform要覆盖的参数。就像是

dependency     = Gem::Dependency.new name
fetcher        = Gem::SpecFetcher.fetcher
spec_tuples, _ = fetcher.spec_for_dependency dependency, true # true added here

推荐阅读