konacha在config.after_initialized执行后初始化

时间:2013-03-17 01:45:17

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 konacha

我正在尝试使用konacha创建一个Rails应用程序。

$ ruby --version
ruby 1.9.3p0 (2011-10-30 revision 33570) [i686-linux]
  • rails(3.2.11)
  • konacha(2.5.1)

问题是konacha无法运行测试,但它可以找到它们。

我探索了代码,发现其初始化程序名为konacha.environment,是在每个config.after_initialize块之后执行的。

通常情况下,konacha的测试目录应添加到config.assets.paths中的konacha.environment,然后在config.after_initializeSprockets::Bootstrap运行以执行有关assets.paths的操作。但在我的环境中,订单是相反的,这意味着Sprocket会在konacha更新之前加载资产路径。

我进一步探索了初始化器,发现初始化器的顺序在tsort之前是正确的。但在那之后,订单已被逆转。我将调试表达式嵌入到代码中并输出执行顺序。

嵌入式调试表达式:

def run_initializers(group=:default, *args)
  return if instance_variable_defined?(:@ran)
  initializers.each do |i|
    puts "before tsort: [[#{i.after.inspect}]]->  [[#{i.name.inspect}]]  ->[[#{i.before.inspect}]]"
  end.tsort.each do |i|
    puts "after tsort: [[#{i.after.inspect}]]->  [[#{i.name.inspect}]]  ->[[#{i.before.inspect}]]"
  end.each do |initializer|
    initializer.run(*args) if initializer.belongs_to?(group)
  end
  @ran = true
end

输出:

...
before tsort: [[:append_assets_path]]->  [[:prepend_helpers_path]]  ->[[nil]]
before tsort: [[:prepend_helpers_path]]->  [[:load_config_initializers]]  ->[[nil]]
before tsort: [[:load_config_initializers]]->  [[:engines_blank_point]]  ->[[nil]]
before tsort: [[nil]]->  [["konacha.environment"]]  ->[[nil]]
before tsort: [[nil]]->  [[:set_load_path]]  ->[[:bootstrap_hook]]
before tsort: [[:set_load_path]]->  [[:set_autoload_paths]]  ->[[:bootstrap_hook]]
before tsort: [[:set_autoload_paths]]->  [[:add_routing_paths]]  ->[[nil]]
...
before tsort: [[:add_to_prepare_blocks]]->  [[:run_prepare_callbacks]]  ->[[nil]]
before tsort: [[:run_prepare_callbacks]]->  [[:eager_load!]]  ->[[nil]]
before tsort: [[:eager_load!]]->  [[:finisher_hook]]  ->[[nil]]
before tsort: [[:finisher_hook]]->  [[:set_routes_reloader_hook]]  ->[[nil]]
before tsort: [[:set_routes_reloader_hook]]->  [[:set_clear_dependencies_hook]]  ->[[nil]]
before tsort: [[:set_clear_dependencies_hook]]->  [[:disable_dependency_loading]]  ->[[nil]]
...

...
after tsort: [[:define_main_app_helper]]->  [[:add_to_prepare_blocks]]  ->[[nil]]
after tsort: [[:add_to_prepare_blocks]]->  [[:run_prepare_callbacks]]  ->[[nil]]
after tsort: [[:run_prepare_callbacks]]->  [[:eager_load!]]  ->[[nil]]
after tsort: [[:eager_load!]]->  [[:finisher_hook]]  ->[[nil]]
after tsort: [[:finisher_hook]]->  [[:set_routes_reloader_hook]]  ->[[nil]]
after tsort: [[:set_routes_reloader_hook]]->  [["append marketable routes"]]  ->[[nil]]
after tsort: [[:set_routes_reloader_hook]]->  [["add marketable route parts to reserved words"]]  ->[[nil]]
after tsort: [[:load_config_initializers]]->  [[:engines_blank_point]]  ->[[nil]]
after tsort: [[:load_config_initializers]]->  [[:engines_blank_point]]  ->[[nil]]
after tsort: [[nil]]->  [["konacha.environment"]]  ->[[nil]]
after tsort: [[:load_config_initializers]]->  [[:engines_blank_point]]  ->[[nil]]
after tsort: [[:load_config_initializers]]->  [[:engines_blank_point]]  ->[[nil]]
after tsort: [[:load_config_initializers]]->  [[:engines_blank_point]]  ->[[nil]]
after tsort: [[:load_config_initializers]]->  [[:engines_blank_point]]  ->[[nil]]
after tsort: [[:load_config_initializers]]->  [[:engines_blank_point]]  ->[[nil]]
after tsort: [[nil]]->  [["static assets"]]  ->[[nil]]
after tsort: [[:load_config_initializers]]->  [[:engines_blank_point]]  ->[[nil]]
after tsort: [[nil]]->  [["register refinerycms_town_story_articles plugin"]]  ->[[nil]]
after tsort: [[:load_config_initializers]]->  [[:engines_blank_point]]  ->[[nil]]
after tsort: [[:set_routes_reloader_hook]]->  [[:set_clear_dependencies_hook]]  ->[[nil]]
after tsort: [[:set_clear_dependencies_hook]]->  [[:disable_dependency_loading]]  ->[[nil]]

整个输出位于Gist

请注意,config.after_initialize在名为:finisher_hook的初始化程序中调用。

我还找到了解决此问题的方法。只需定义以下空初始化程序,一切正常:

initializer "dummy", after: 'konacha.environment', before: :finisher_hook do |app|
end

但我想知道谁应该对这个问题负责。 这是konacha的问题,Rails的问题,还是我的误解还是什么?

0 个答案:

没有答案