2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

bundle install しようとすると Too many gems と言われる

Last updated at Posted at 2015-02-18

問題

先日開発している 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 までしかリクエストをかけてはいけないようです。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?