自从过去几个月以来,我看到为 Rails 应用程序执行“捆绑安装”命令,gemfile 中提到的源被请求两次,而它应该只请求 gemfile 中提到的每个源一次。
谁能告诉我为什么会这样并建议解决方法?
自从过去几个月以来,我看到为 Rails 应用程序执行“捆绑安装”命令,gemfile 中提到的源被请求两次,而它应该只请求 gemfile 中提到的每个源一次。
谁能告诉我为什么会这样并建议解决方法?
事实上,bundler 不会两次命中 rubygems,或者至少不是出于相同的原因。
Fetching gem metadata from https://rubygems.org/........
Fetching gem metadata from https://rubygems.org/..
如果您查看“捆绑更新”期间执行的查询,您会得到以下结果:
https://rubygems.org:443
http://bundler.rubygems.org/api/v1/dependencies?gems=airbrake,aws-sdk
http://bundler.rubygems.org/api/v1/dependencies?gems=json,activesupport,builder
http://bundler.rubygems.org/api/v1/dependencies?gems=climate_control,rubinius-actor
http://bundler.rubygems.org/api/v1/dependencies?gems=term-ansicolor,gherkin
http://bundler.rubygems.org/api/v1/dependencies?gems=little-plugger,loquacious
http://bundler.rubygems.org/api/v1/dependencies?gems=bones-rcov,bones-rubyforge
http://bundler.rubygems.org/api/v1/dependencies?gems=systemu
http://bundler.rubygems.org/api/v1/dependencies?gems=restclient,spicycode-rcov
为了便于阅读,我故意缩短了 URL
如果您在浏览器中输入此 URL
http://bundler.rubygems.org/api/v1/dependencies.json?gems=airbrake
您可能已经注意到,我添加了 .json 扩展名来获得 json 输出,因为默认格式是二进制
你会看到这样的东西
[
{
"name":"airbrake",
"number":"3.1.8",
"platform":"ruby",
"dependencies":[
["json",">= 0"],
["activesupport",">= 0"],
["builder",">= 0"]
]
},
... (content removed)
]
这个响应告诉我们 airbrake gem 依赖于 json、activesupport 和 builder。因此,bundler 需要向 rubygems 询问有关这 3 个 gem 的更多信息。如果您查看上面的第二个查询,这正是它的作用。
http://bundler.rubygems.org/api/v1/dependencies?gems=json,activesupport,builder
此过程将一直进行,直到解决所有依赖项。这就是为什么点的数量可能会根据解决所有依赖关系的“迭代”次数而改变。
但是,我必须承认,消息显示两次的原因仍不清楚。此外,点数(10)与查询数(9)并不完全对应……我需要对此进行更多调查。