为了在build时能方便切换blog文章的来源目录,打算在config.rb中作如下定义

set :evernotes_dir, 'evernotes_0'


然后在extension的before_build方法中按官方文档所教的“以config[:xxx]命令获取”,但不行。细看一下,发现文档说的只是在template和helper中使用,至于在extension如何访问,则没说。

试着在before_build中用pry查看下有什么看上去像config的方法:

[8] pry(#)> methods.sort.join ', '
=> "!, !=, !~, <=>, ==, ===, =~, Contract, __binding__, __id__, __pry__, __send__, add_exposed_to_context, after_extension_activated, app, before_build, blank?, class, class_eval, clone, deep_dup, define_singleton_method, display, dup, duplicable?, enum_for, eql?, equal?, extend, freeze, frozen?, functype, hash, html_safe?, inspect, instance_eval, instance_exec, instance_of?, instance_variable_defined?, instance_variable_get, instance_variable_set, instance_variables, is_a?, is_haml?, itself, kind_of?, logger, method, methods, nil?, object_id, options, presence, present?, pretty_inspect, pretty_print, pretty_print_cycle, pretty_print_inspect, pretty_print_instance_variables, private_methods, protected_methods, pry, psych_to_yaml, public_method, public_methods, public_send, remove_instance_variable, respond_to?, send, singleton_class, singleton_method, singleton_methods, taint, tainted?, tap, to_enum, to_json, to_param, to_query, to_s, to_yaml, to_yaml_properties, trust, try, try!, untaint, untrust, untrusted?"


没有,再试看有什么实例变量:

[10] pry(#)> instance_variables
=> [:@_helpers, :@app, :@options]
[11] pry(#)> @options
=> #<middleman::configuration::configurationmanager:0xa10b1d4  @finalized="true,"  @settings="{:my_option=">#<middleman::configuration::configsetting:0xa10b044 @default="default" ,="" @description="An example option" ,="" @key=":my_option," @options="{}," @value_set="false">}>
[12] pry(#)> @app
=> #</middleman::configuration::configsetting:0xa10b044></middleman::configuration::configurationmanager:0xa10b1d4>


也没看出什么像样的东西。

考虑到在build的过程中肯定会在某一级调用读取config.rb,因此,想用binding_of_caller这个gem来探测调用栈中哪里有config、evernotes_dir、evernotes_dir这样的字眼。(为了方便,用enhance过的binding_of_callers)

[14] pry(#)> bs = binding.of_callers!
=> [#<binding:86248360 evermid#__pry__="" (pry):7="">,
 #<binding:86210310 pry#evaluate_ruby="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" pry_instance.rb:355="">,
 #<binding:86204680 pry#handle_line="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" pry_instance.rb:355="">,
 #<binding:86167060 pry#block="" (2="" levels)="" in="" eval="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" pry_instance.rb:323="">,
 #<binding:86121230 pry#block="" in="" eval="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" pry_instance.rb:243="">,
 #<binding:86116250 pry#eval="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" pry_instance.rb:242="">,
 #<binding:86078760 pry::repl#block="" in="" repl="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" pry_instance.rb:242="">,
 #<binding:86073630 pry::repl#repl="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" pry_instance.rb:241="">,
 #<binding:86043750 pry::repl#block="" in="" start="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" pry_instance.rb:241="">,
 #<binding:86011310 pry::inputlock#__with_ownership="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" repl.rb:77="">,
 #<binding:85973270 pry::inputlock#with_ownership="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" repl.rb:67="">,
 #<binding:85968860 pry::repl#start="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" repl.rb:67="">,
 #<binding:85948270 pry::repl.start="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" repl.rb:38="">,
 #<binding:85943700 pry.start="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" input_lock.rb:61="">,
 #<binding:85929950 evermid#pry="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" input_lock.rb:61="">,
 #<binding:85892790 evermid#before_build="" home="" ken="" .rvm="" gems="" ruby-2.2.2="" gems="" pry-0.10.4="" lib="" pry="" input_lock.rb:79="">,
 #<binding:85888300 middleman::application#block="" in="" bind_before_build="" ho="" ......<="" code=""></binding:85888300></binding:85892790></binding:85929950></binding:85943700></binding:85948270></binding:85968860></binding:85973270></binding:86011310></binding:86043750></binding:86073630></binding:86078760></binding:86116250></binding:86121230></binding:86167060></binding:86204680></binding:86210310></binding:86248360>


很多,也很难看,直接探测实例变量:

[19] pry(#)> bs.map{|b| [b.klass, b.iv.select{|name| name =~ /config/}]}
=> [[EverMid, {}],
......
 [Pry::REPL, {}],
 [Pry, {:@config=><pry::config:0x4bdc76c^a local_keys="['hooks']" default="<Pry::Config::Default:0x4bdc8de^A" local_keys="['gist','history']" default="nil">>}],
 [EverMid, {}],
 [EverMid, {}],
 [Middleman::Application,
  {:@config_context=>
......
       :evernotes_dir=>#<middleman::configuration::configsetting:0xa10a8b0 @default="evernotes_0" ,="" @description="nil," @key=":evernotes_dir," @options="{}," @value="evernotes_0" ,="" @value_set="true">}>}],
 [Middleman::CallbackManager, {}],</middleman::configuration::configsetting:0xa10a8b0></pry::config:0x4bdc76c^a>


终于发现了:evernotes_dir、evernotes_0,在Middleman::Application类中。想起刚才extension中有个实例变量@app,试试

[21] pry(#)> @app.methods.sort.join ', '
=> "!, !=, !~, <=>, ==, ===, =~, Contract, __binding__, __contracts_ruby_original_build?_ix0hp0bmej, __contracts_ruby_original_config_context_ix0hp0ble6bp, __contracts_ruby_original_config_ix0hp0bl8hm2, __contracts_ruby_original_development?_ix0hp0bnhrqm, __contracts_ruby_original_environment?_ix0hp0bn8qel, __contracts_ruby_original_environment_ix0hp0bnk1jp, __contracts_ruby_original_extensions_ix0hp0blctlv, __contracts_ruby_original_map_ix0hp0bnbeki, __contracts_ruby_original_mappings_ix0hp0blcpvd, __contracts_ruby_original_middleware_ix0hp0bld93n, __contracts_ruby_original_mode?_ix0hp0bmjim0, __contracts_ruby_original_production?_ix0hp0bnawq8, __contracts_ruby_original_server?_ix0hp0bmkvoo, __contracts_ruby_original_sitemap_ix0hp0blgt4w, __contracts_ruby_original_source_dir_ix0hp0bnhp6o, __id__, __send__, activate, after_build, after_configuration, after_configuration_eval, after_render, apply_cli_options, asset_path, before, before_build, before_configuration, before_extensions, before_instance_block, before_render, before_server, before_shutdown, before_sitemap, blank?, build?, callbacks_for, class, class_eval, clone, config, config_context, configure, data, deep_dup, define_setting, define_singleton_method, development?, display, dup, duplicable?, enum_for, environment, environment?, eql?, equal?, evaluate_configuration!, execute_callbacks, extend, extensions, files, freeze, frozen?, functype, generic_template_context, hash, html_safe?, ignore, image_tag, initialized, inspect, instance_eval, instance_exec, instance_of?, instance_variable_defined?, instance_variable_get, instance_variable_set, instance_variables, instrument, is_a?, is_haml?, itself, kind_of?, link_to, logger, map, mappings, method, methods, middleware, mode?, nil?, object_id, presence, present?, pretty_inspect, pretty_print, pretty_print_cycle, pretty_print_inspect, pretty_print_instance_variables, private_methods, production?, protected_methods, prune_tilt_templates!, pry, psych_to_yaml, public_method, public_methods, public_send, ready, reload, remove_instance_variable, respond_to?, rewrite_inline_urls, root, root_path, send, server?, set, shutdown!, singleton_class, singleton_method, singleton_methods, sitemap, source_dir, subscribe_to_callbacks, taint, tainted?, tap, template_context_class, to_enum, to_json, to_param, to_query, to_s, to_yaml, to_yaml_properties, trust, try, try!, untaint, untrust, untrusted?, use"
[24] pry(#)> @app.config[:evernotes_dir]
=> "evernotes_0"


即是,在extension里可使用app.config[:xxx]来获取config.rb的配置