【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