とある 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があるので、色々叩いてみるのも面白いかもしれない。