問題
先日開発している Ruby on Rails のアプリケーションで下のようなエラーが突然出るようになりました。
$ bundle # bundle install の省略形
Fetching gem metadata from https://rubygems.org/...Retrying dependency api due to error (2/3): Bundler::HTTPError Net::HTTPUnprocessableEntity: Too many gems (use --full-index instead)
Retrying dependency api due to error (3/3): Bundler::HTTPError Net::HTTPUnprocessableEntity: Too many gems (use --full-index instead)
Too many gems
… 確かに Gem は結構使ってますが、「絶対にこのシステムよりも多く使っているものがあるはず。他のところにエラーが有るに違いない」と思い、調べてみたところ、Bundler
のエラーということが分かりました。
GitHub イシュー にも書いてありますが、1.7.13 以降では直っているようです。
直し方
まずは今使っている bundler
のバージョンを調べてみましょう。
$ gem search -l bundler
*** LOCAL GEMS ***
bundler (1.7.11)
古いですね。gem install
で最新のをインストールしてみましょう。
$ gem install bundler
Fetching: bundler-1.8.2.gem (100%)
Successfully installed bundler-1.8.2
Parsing documentation for bundler-1.8.2
Installing ri documentation for bundler-1.8.2
Done installing documentation for bundler after 3 seconds
1 gem installed
僕が実行したタイミングでは 1.8.2
が入りました。
これで bundle install
が通るようになります。
詳しく調べてみました
せっかくなので、どんな感じのバグだったのか調べてみました。
探しまわったら、このコミット で直ってるとのことなので、中身を見てみましょう。
@@ -301,10 +301,14 @@ def dependency_api_uri(gem_names = [])
# fetch from Gemcutter Dependency Endpoint API
def fetch_dependency_remote_specs(gem_names)
Bundler.ui.debug "Query Gemcutter Dependency Endpoint API: #{gem_names.join(',')}"
- marshalled_deps = fetch dependency_api_uri(gem_names)
- gem_list = Bundler.load_marshal(marshalled_deps)
+ gem_list = []
deps_list = []
+ gem_names.each_slice(Source::Rubygems::API_REQUEST_LIMIT) do |names|
+ marshalled_deps = fetch dependency_api_uri(names)
+ gem_list += Bundler.load_marshal(marshalled_deps)
+ end
+
spec_list = gem_list.map do |s|
dependencies = s[:dependencies].map do |name, requirement|
dep = well_formed_dependency(name, requirement.split(", "))
Source::Rubygems::API_REQUEST_LIMIT = 500
ずつで each_slice
してるのが分かりますね。
どうやら、Ruby Gems のサイトが 1 クエリー当たり 500 個の Gem までしかリクエストをかけてはいけないようです。