Railsにコントリビュートした

軽い気持ちでpull requestを送ってみたら数十分後になんとmergeされてしまった。間違ってmasterブランチに送ってしまったため、おそらくrails 5で公開されることになる。

追加したのはrake initializerという簡単なrakeタスクで、railsの起動時に実行されるinitializerを実行順に出力する。

% rake initializer
set_load_path
set_load_path
set_load_path
set_load_path
set_autoload_paths
set_autoload_paths
set_autoload_paths
set_autoload_paths
add_routing_paths
add_routing_paths
add_routing_paths
add_routing_paths
add_locales
add_locales
add_locales
add_locales
add_view_paths
add_view_paths
add_view_paths
add_view_paths
load_environment_config
load_environment_config
load_environment_config
load_environment_config
load_environment_hook
load_active_support
set_eager_load
initialize_logger
initialize_cache
initialize_dependency_mechanism
bootstrap_hook
active_support.deprecation_behavior
prepend_helpers_path
prepend_helpers_path
prepend_helpers_path
prepend_helpers_path
load_config_initializers
load_config_initializers
load_config_initializers
load_config_initializers
active_support.halt_callback_chains_on_return_false
active_support.initialize_time_zone
active_support.initialize_beginning_of_week
active_support.set_configs
action_dispatch.configure
active_model.secure_password
action_view.embed_authenticity_token_in_remote_forms
action_view.logger
action_view.set_configs
action_view.caching
action_view.collection_caching
action_view.setup_action_pack
action_controller.assets_config
action_controller.set_helpers_path
action_controller.parameters_config
action_controller.set_configs
action_controller.compile_config_methods
active_record.initialize_timezone
active_record.logger
active_record.migration_error
active_record.check_schema_cache_dump
active_record.set_configs
brancher.rename_database
active_record.initialize_database
active_record.log_runtime
active_record.set_reloader_hooks
active_record.add_watchable_files
global_id
active_job.logger
active_job.set_configs
action_mailer.logger
action_mailer.set_configs
action_mailer.compile_config_methods
setup_sass
setup_compression
jbuilder
web_console.initialize
web_console.insert_middleware
web_console.templates_path
web_console.whitelisted_ips
web_console.whiny_requests
web_console.acceptable_content_types
engines_blank_point
engines_blank_point
engines_blank_point
engines_blank_point
append_assets_path
append_assets_path
append_assets_path
turbolinks
append_assets_path
add_generator_templates
ensure_autoload_once_paths_as_subset
add_builtin_route
build_middleware_stack
define_main_app_helper
add_to_prepare_blocks
run_prepare_callbacks
eager_load!
finisher_hook
set_routes_reloader_hook
set_clear_dependencies_hook
disable_dependency_loading

もともとは、naoty/brancherというrubygemを作るときに、railsの初期化プロセスにコードを差し込みたくてinitializerが実行される順番を確認するデバッグ用のコードを書いていたのがきっかけだった。似たようなrakeタスクにrake middlewareというものがあり、これがあるならrake initializerもあっていいだろうという軽い気持ちでpull requestを送ってみた。

意外とすんなりmergeしてもらったので、railsへのコントリビュートに対して心理的なハードルがかなり低くなった。上の出力を見てもらえればわかるとおり同じようなinitializerが実行されており、起動が遅くなったり、initializerで定数を定義したときに大量のwarningが出たりする。前々から定数のwarningが大量に出る問題は不思議に思っていたが、これが原因なのかもしれない。またコントリビュートするとしたら、ここらへんを解決するところになりそう。