QA@IT

Gemを作成する際、依存するGemをbundle installでインストールさせるには?

3205 PV

上記のGemを作成中なのですが、add_dependencyとrequireを下記の通り指定してもRailsアプリでのbundle install時に指定したGemがインストールされず「`require': cannot load such file -- omniauth/scaffold (LoadError)」というエラーになってしまいます。

$ ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-darwin10.8.0]
$ rails -v
Rails 3.2.9

omniauth-scaffold.gemspec

  gem.add_dependency 'rails_config'
  gem.add_dependency 'omniauth-twitter'
  gem.add_dependency 'omniauth-facebook'
  gem.add_dependency 'omniauth-github'
  gem.add_dependency 'tapp'
  gem.add_dependency 'awesome_print'

lib/omniauth-scaffold.rb

require 'rails_config'
require 'omniauth-twitter'
require 'omniauth-facebook'
require 'omniauth-github'
require 'tapp'
require 'awesome_print'

RailsアプリのGemfileの方で下記のように依存するGemも記述すればエラーは回避できるのですが、bundle install時に一緒に依存するGemもインストールさせるには何か設定や記述が足りないのでしょうか?

# For OmniAuth
gem 'omniauth-scaffold'
gem 'rails_config'
gem 'omniauth-twitter'
gem 'omniauth-facebook'
gem 'omniauth-github'
gem 'tapp'
gem 'awesome_print'

回答

Bundler は依存関係をチェックする際に Bundler::Fetcher#fetch_remote_specs で rubygems.org から gem のメタデータを取得しているようです。ここで取得した情報をみてみると、omniauth-scaffold 0.1.21 の dependencies が空になっていました。

この情報は rubygems.org の API で取得していて、下記の Ruby コードで確認できます。

require "open-uri"
require "pp"

url = "https://rubygems.org/api/v1/dependencies?gems=omniauth-scaffold"
pp Marshal.load(open(url))

これをみると 0.1.6 までは dependencies が定義されているようですが、0.1.11 からは空になっています。

gem install omniauth-scaffoldgem specification -r omniauth-scaffold は期待通りに動作するので、rubygems.org の問題なのかもしれません。rubygems.org のフォーラム (http://groups.google.com/group/rubygems-org) できいてみるといいかもしれません。

編集 履歴 (0)
  • ありがとうございます。一度jewelerで作ったものをbundlerで作り直したのでそのためかと思いましたが、0.1.7以降でダメならちょっと違いそうですね。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。