*いしのなかにいる*

oops ! I am in rock !

【Ruby】NameErrorが出てrakeタスクが実行できない!

rakeタスクの作成にチャレンジしてみました。

Capybaraでサイト情報を解析するクローラを作っていたので、 こいつを呼び出すように実装してみたのですが、どうにもうまくいかず。

やったこと

クローラのモジュールをrakeタスクから呼び出すだけ、だと思っていたのですが・・・
なかなかうまくいかなかったです。

コードは次のような感じに作りました。

rakeファイル

namespace :crawler do

  desc 'クローラだよ'
  task :anlyze, ['platform'] => :environment do |t, args|
     HogeCrawler.anlyze
  end
end

クローラ

module HogeCrawler

  class << self

    def anlyze
 

こんな感じに作ってみました。

さて、実行!

$ bundle exec rake crawler:anlyze

結果、エラー

rake aborted!
NameError: uninitialized constant HogeCrawler
/Users/user/anlyzer/lib/tasks/crawler.rake:5:in `block (2 levels) in <top (required)>'
Tasks: TOP => crawler:anlyze
(See full trace by running task with --trace)

となってしまって実行できない。 –traceつけてみてもわからずでした。

bundle exec rake crawler:anlyze --trace
** Invoke crawler:anlyze (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute crawler:anlyze
rake aborted!
NameError: uninitialized constant HogeCrawler
/Users/user/anlyzer/lib/tasks/crawler.rake:5:in `block (2 levels) in <top (required)>'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/task.rb:248:in `block in execute'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/task.rb:243:in `each'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/task.rb:243:in `execute'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/task.rb:187:in `block in invoke_with_call_chain'
/Users/user/.rbenv/versions/2.3.0/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/task.rb:180:in `invoke_with_call_chain'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/task.rb:173:in `invoke'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:150:in `invoke_task'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:106:in `block (2 levels) in top_level'
/Users/zuser/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:106:in `each'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:106:in `block in top_level'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:115:in `run_with_threads'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:100:in `top_level'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:78:in `block in run'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:176:in `standard_exception_handling'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:75:in `run'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/bin/rake:33:in `<top (required)>'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/bin/rake:23:in `load'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/bin/rake:23:in `<main>'
Tasks: TOP => crawler:anlyze

原因

結局のところエラーの通りでした。 命名規約に沿ってなかっただけ。

rakeで呼び出そうとしているモジュールとメソッドは合ってるんだけど、ファイル名が「hogehoge.rb」ってなってたせい。

うわぁ・・・

クローラのファイル名をモジュール名に合わせて『hoge_crawler.rb』としたら動くようになりましたとさ。 Rails、もっと勉強しないとなぁ。

参考リンク

rake コマンドで NameError: uninitialized constant エラー rake task だけで起きる NameError: uninitialized constant ModelName