Ruby
rubygems

[Ruby] 特定の gem に依存している gem の一覧を調べる

More than 3 years have passed since last update.

とある gem 「が」 依存している gem の一覧を出すのは非常に簡単で、 gem コマンド一発で行うことができる。

$ gem dependency nokogiri

では、逆にとある gem 「に」 依存している gem の一覧を出すのはどうやるのだろうか?

ローカルで調査

ローカルにあるものであれば同様に gem コマンド一発で調べることができる。
gem dependency--reverse-dependencies または -R を付ければよい。

$ gem dependency -R nokogiri
Gem nokogiri-1.6.6.2
  hoe (~> 3.13, development)
  hoe-bundler (>= 1.1, development)
  hoe-debugging (~> 1.2.0, development)
  hoe-gemspec (>= 1.0, development)
  hoe-git (>= 1.4, development)
  mini_portile (~> 0.6.0)
  minitest (~> 2.2.2, development)
  racc (>= 1.4.6, development)
  rake (>= 0.9, development)
  rake-compiler (~> 0.9.2, development)
  rake-compiler-dock (~> 0.3.0, development)
  rdoc (~> 4.0, development)
  rexical (>= 1.0.5, development)
  Used by
    capybara-2.4.4 (nokogiri (>= 1.3.3))
    loofah-2.0.2 (nokogiri (>= 1.5.9))
    mechanize-2.7.3 (nokogiri (~> 1.4))
    rails-dom-testing-1.0.6 (nokogiri (~> 1.6.0))
    roo-2.1.0 (nokogiri (~> 1))
    sequel-4.24.0 (nokogiri (>= 0, development))
    sprockets-3.2.0 (nokogiri (~> 1.3, development))
    webrobots-0.1.1 (nokogiri (>= 1.4.4, development))
    xpath-2.0.0 (nokogiri (~> 1.3))

このうち「Used by」以下が指定の gem に依存しているもののようだ。

リモートで調査

上記のコマンドではインストール済みのものしか調べられない。
では、インストールしていない、 Rubygems.org 上にアップロードされている全 gem を対象に調査するにはどうすればよいのだろうか?

誤ったやり方

コマンドで引けるのだから --remote (または -r)オプションを付ければ行けるのでは?と思ってやってみた。

$ gem dependency -R -r nokogiri
ERROR:  Only reverse dependencies for local gems are supported.

どうやら gem dependency -R はローカルしか対象とすることができないようだ。

Rubygems.org APIを直接叩いてみる

何か方法はないものか...、とおもむろに Rubygems.org のAPIリファレンスを見に行ってみると、このようなものを見つけた。

RubyGems.org API - RubyGems Guides

GET - /api/v1/gems/[GEM NAME]/reverse_dependencies.json

List gems that depends on specified gem. This is all the dependents of particular gem. Returns an array that includes names of dependent gems.

これを使えば行けるのではないか?と思い早速やってみた。

$ curl https://rubygems.org/api/v1/gems/nokogiri/reverse_dependencies.json
(長いので略)

どうやらこれで正解のようだ。
JSONの配列で返ってくるので、この結果をパースして利用するとよい。
残念ながら依存しているバージョンは分からないが、そこは更に調査する他なさそうだ。

gems gem を利用してRuby上から調べる

このAPI周りを調べていて初めて知ったのだが、 Rubygems.org APIラッパーの gems という gem があるらしい。
上記APIが Rubygems.org に取り込まれたのが 2013/03/25 のようだが(このPR参照)、同PR内に「gems gemにも追加しておいてくれよ!」的なコメントがあった。
gem install gems をした後に下記のようなコードを書けばJSONをパースした後の配列を返してくれるようだ。

require 'gems'

Gems.reverse_dependencies 'nokogiri' #=> ["carmens", "jekyll-toc", ...]

返り値はAPIを直接叩くのと当然変わらないし、同APIはAPIキーが必要なものでもないため、依存を調べるためだけに gems gem は導入しなくてもよいかな...と思わないでもない。
Rubygems.org には他にもAPIがあるので、色々叩いてみるのも面白いかもしれない。