- ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux](RVMでインストールしたもの)
- yuanying-yapra-v0.1.3-2-g8d130c0
mechanize がインストールされていない状態でmechanize を使うプラグインをロードすると、次のようなエラーメッセージが表示される。
NameError in 'undefined local variable or method `command' for #<Yapra::Pipeline:0x000000028f4420>' /home/user/my-yapra/yapra/lib/yapra/pipeline_base.rb:37:in `load' /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:73:in `run_class_based_plugin' /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:54:in `execute_plugin' /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:37:in `block in run' /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:36:in `each' /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:36:in `inject' /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:36:in `run' /home/user/my-yapra/yapra/lib/yapra/runtime.rb:47:in `execute_pipeline' /home/user/my-yapra/yapra/lib/yapra/runtime.rb:37:in `block in execute' /home/user/my-yapra/yapra/lib/yapra/runtime.rb:36:in `each' /home/user/my-yapra/yapra/lib/yapra/runtime.rb:36:in `execute' /home/user/my-yapra/yapra/bin/yapra:69:in `block in <main>' /home/user/my-yapra/yapra/bin/yapra:55:in `each' /home/user/my-yapra/yapra/bin/yapra:55:in `<main>'
- https://github.com/yuanying/yapra/blob/86a1c2e3d32e9a17345fff87defee5cd0aab1f30/lib/yapra/pipeline_base.rb
- https://github.com/yuanying/yapra/blob/1cb827fb1c2702c4f9732da083735112dea572e4/lib/yapra/pipeline.rb
実際は mechanize の require で LoadError になっているのだが、上のメッセージだけでは原因が分からない。
というか、 require でこけているのとは無関係に、ローカル変数 command が未定義だと言われている。
継承ツリー
- Yapra::PipelineBase
- Yapra::Pipeline
- Yapra::RbPipeline
lib/yapra 以下の load() の出現箇所は次の2箇所。
pipeline.rb: plugin = load(command['module']) pipeline_base.rb: def load plugin_name
なので、影響範囲は PipelineBase と Pipiline の該当箇所だけ。
load の引数にプラグイン名ではなく command を渡すようにしてみた。
pipeline_base.rb - def load plugin_name + def load command + plugin_name = command['module'] pipeline.rb - plugin = load(command['module']) + plugin = load(command)
https://github.com/sonota/yapra/commit/026a3e057366d0c12e45d8486c97725bb0f64e33
そうすると、エラー出力が次のようになり、mechanize のロードでこけてることが分かるようになった。
LoadError in 'cannot load such file -- mechanize': Misc::Sample module is not found. (LoadError) from /home/user/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require' from /home/user/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require' from /home/user/my-yapra/yapra/lib/yapra/plugin/mechanize_base.rb:1:in `<top (required)>' from /home/user/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require' from /home/user/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require' from /home/user/my-yapra/my-dir-class-base/yapra/plugin/misc/sample.rb:3:in `<top (required)>' from /home/user/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require' from /home/user/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require' from /home/user/my-yapra/yapra/lib/yapra.rb:32:in `load_class_constant' from /home/user/my-yapra/yapra/lib/yapra/pipeline_base.rb:33:in `block in load' from /home/user/my-yapra/yapra/lib/yapra/pipeline_base.rb:30:in `each' from /home/user/my-yapra/yapra/lib/yapra/pipeline_base.rb:30:in `load' from /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:74:in `run_class_based_plugin' from /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:54:in `execute_plugin' from /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:37:in `block in run' from /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:36:in `each' from /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:36:in `inject' from /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:36:in `run' (略)