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

  • 36
    Like
  • 0
    Comment
More than 1 year has 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やモデルにアクセスするとき以外にも使える