Gemに依存Gem情報を書くときはGemfileじゃなくて.gemspecに書くこと!
ちょっとハマったので備忘録です。
タイトルの通り、Gemを作るとき依存関係のGemの情報を書くときはGemfileじゃなくて.gemspecに書くようです。 詳しくは
gemライブラリの依存はGemfileではなくgemspecに記述する理由 - Qiita
こちらに詳しく載っていますが、私の場合、何回か試してもダメでした。 最終的には使えるようになったのですが以下のことを試しました。
- そもそも依存gem云々の前に作成されたgemファイルも一緒にリポジトリにあげていました。
その結果、
bundle install
したら、こんなエラーが出ました。
$ bundle install Ignoring io-console-0.4.6 because its extensions are not built. Try: gem pristine io-console --version 0.4.6 Ignoring json-2.0.2 because its extensions are not built. Try: gem pristine json --version 2.0.2 Ignoring mysql-2.9.1 because its extensions are not built. Try: gem pristine mysql --version 2.9.1 Ignoring psych-2.1.0 because its extensions are not built. Try: gem pristine psych --version 2.1.0 Fetching https://github.com/xiao1203/stock_fundamental_scraper.git You have one or more invalid gemspecs that need to be fixed. The gemspec at /usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/bundler/gems/stock_fundamental_scraper-a2e8bc06c189/stock_fundamental_scraper.gemspec is not valid. Please fix this gemspec. The validation error was 'stock_fundamental_scraper-1.0.0 contains itself (stock_fundamental_scraper-1.0.0.gem), check your files list'
ここに書いてあるように
gem pristine json --version 2.0.2
を試してstock_fundamental_scraper-1.0.0
をリポジトリから削除しました。
- gem依存で怒られる
本題ですね。
こんなのが出ました。
※野良Gemをrails アプリケーションに組み込むため、
rails側のGemfileにgem 'stock_fundamental_scraper', github: 'xiao1203/stock_fundamental_scraper'
を追加して、
rails s
を実行しました。
$ rails s Ignoring io-console-0.4.6 because its extensions are not built. Try: gem pristine io-console --version 0.4.6 /usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/bundler/gems/stock_fundamental_scraper-140f22be3000/lib/stock_fundamental_scraper/scraper.rb:1:in `require': cannot load such file -- mechanize (LoadError)
こんな感じに怒られました。
- Gemfileから依存gem情報を削除し、(コメントアウトしました)
source 'https://rubygems.org' # Specify your gem's dependencies in stock_fundamental_scraper.gemspec gemspec # gem 'mechanize' # gem 'nokogiri' # gem 'pry'
gemspecにはこのように記載
lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'stock_fundamental_scraper/version' Gem::Specification.new do |spec| spec.name = "stock_fundamental_scraper" spec.version = StockFundamentalScraper::VERSION 省略 spec.add_development_dependency "bundler", "~> 1.13" spec.add_development_dependency "rake", "~> 10.0" spec.add_development_dependency "rspec", "~> 3.0" spec.add_runtime_dependency 'mechanize' spec.add_runtime_dependency 'nokogiri' end
再度実行。
$ rails s /usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/bundler/gems/stock_fundamental_scraper-140f22be3000/lib/stock_fundamental_scraper/scraper.rb:1:in `require': cannot load such file -- mechanize (LoadError)
変わんねーじゃん。。
- bundle installがうまくいってないのかな、と思い、
/usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/bundler/gems/
にいるgemを直接削除して、再度bundle install
、リトライ
$ rails s /usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/bundler/gems/stock_fundamental_scraper-140f22be3000/lib/stock_fundamental_scraper/scraper.rb:1:in `require': cannot load such file -- mechanize (LoadError) from /usr/local/var/rbenv/versio
心折れるわ〜
- gemを物理削除するんじゃなく、uninstallのほうが良いかも
$ gem uninstall stock_fundamental_scraper
でもう一度リトライ
$ rails s /usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/bundler/gems/stock_fundamental_scraper-140f22be3000/lib/stock_fundamental_scraper/scraper.rb:1:in `require': cannot load such file -- mechanize (LoadError)
……(怒)
- updateはどうだ?
$ bundle update stock_fundamental_scraper
リトライ
$ rails s => Booting Puma => Rails 5.0.1 application starting in development on http://localhost:3000 => Run `rails server -h` for more startup options Puma starting in single mode... * Version 3.8.2 (ruby 2.3.1-p112), codename: Sassy Salamander * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://localhost:3000 Use Ctrl-C to stop
よしきたーー
と、まあ、Try & Errorの結果をダラダラ書きました。
やっぱ、gemを修正した後に再読み込みするときは削除してbundle install
ではなく、ちゃんとbundle update
しないといけないってことですかね?