Инициализация konacha после выполнения config.after_initialized
Я пытаюсь создать приложение Rails с коначой.
$ ruby --version
ruby 1.9.3p0 (2011-10-30 revision 33570) [i686-linux]
- рельсы (3.2.11)
- конача (2.5.1)
Проблема в том, что конача не может запускать тесты, хотя может их найти.
Я исследовал код и обнаружил, что его инициализатор, названный konacha.environment
казнили после каждого config.after_initialize
блок.
Обычно тестовый каталог конача должен быть добавлен в config.assets.paths
в konacha.environment
а затем в config.after_initialize
, Sprockets::Bootstrap
бежит делать вещи о assets.paths
, Но в моем окружении порядок обратный, что означает, что Sprocket загружает пути к активам до того, как конача обновит их.
Я также исследовал инициализатор и обнаружил, что порядок инициализаторов был правильным до 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
Но я хочу знать, кто несет ответственность за проблему. Это проблема Конаша, проблема Рельса, или просто мое недоразумение или что-то в этом роде?