LoginSignup
32
25

More than 5 years have passed since last update.

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

Posted at

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

32
25
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
32
25