読者です 読者をやめる 読者になる 読者になる

Gemに依存Gem情報を書くときはGemfileじゃなくて.gemspecに書くこと!

Ruby on Rails Ruby Gem

ちょっとハマったので備忘録です。

タイトルの通り、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)

こんな感じに怒られました。

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しないといけないってことですかね?

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin