Ruby
Rails
rake

rakeタスクを定義するときのおまじない :environment がやっていること

More than 3 years have passed since last update.


おまじない

task test: :environment do

# task
end

railsでDBアクセスしたりするrakeタスクを定義するときに↑の様な感じで:environmentを指定する必要があるが、

その:environmentが何をしているのか不思議だったので調べた


コードを追ってみた(要所だけ)

# https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L432-L441

def run_tasks_blocks(app) #:nodoc:
railties.each { |r| r.run_tasks_blocks(app) }
super
require "rails/tasks"
task :environment do
ActiveSupport.on_load(:before_initialize) { config.eager_load = false }

require_environment!
end
end

railsのコード内に定義されている、

:environmentという名のrakeタスクが呼ばれる

# https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L317-L320

def require_environment! #:nodoc:
environment = paths["config/environment"].existent.first
require environment if environment
end

Rails.rootにあるconfig/environmentrequireされる

# config/environment.rb

# Load the Rails application.
require File.expand_path('../application', __FILE__)

# Initialize the Rails application.
Rails.application.initialize!

Rails.application.initialize!が呼ばれる


まとめ

三行で書くと

:enviromentというrakeタスクを実行して

config/environment.rbrequireして

Rails.application.initialize!してた

なので、DBやモデルにアクセスするとき以外にも使える