Rails

【Rails】タスクを定義し実行することができるrake taskについて簡単にまとめてみる

Rails

 

今回はタスクを自身で定義し、それを必要な時に実行することができるrake task(レイク タスク)について簡単にまとめたので紹介したいと思います。rake taskはRailsの開発で非常に便利なツールの1つであるため、使える場面では積極的に活用することをおすすめします。

rake taskとは

RakeとはRubyで書かれたコードをタスクとして作成しておき必要に応じて呼び出し実行する事が出来る機能。このRakeが実行する処理内容をRakeタスクと呼び、定義する場所をRakefileと呼ぶ。

参考:【Rails】Rakeタスクとは

RakeはRubyのビルドツールであり、特定のタスクを実行するためのスクリプトを定義するために使用されます。Railsアプリケーションで一般的に使用されるため、Railsアプリケーションのビルド・テスト・データベースの操作・デプロイなど様々なタスクを実行するための簡単な方法を提供します。

RakeタスクはRubyコードで記述され、rakeコマンドを使用して実行できます。各タスクは名前、説明、依存関係を持つことができます。

タスクの名前は、コマンドラインで実行するためのプレフィックスを含む名前空間を持つことができます。例えば、db:migrateタスクは、dbという名前空間内に定義されたmigrateタスクになります。

rake taskを作成する場面

rake taskを作成する場面としては以下が挙げられます。(※一例です)

  • データベースの初期化やマイグレーションの実行

データベースの初期化やマイグレーションを手動で実行する場合、毎回同じ手順を踏む必要があります。このような場合、rake taskを作成して自動化することで、手間を省くことができます。

  • ジョブの実行

バッチ処理やジョブ処理を行う場合、rake taskを作成して実行することで、ジョブのスケジューリングや実行を自動化することができます。

  • 開発者向けのツール

開発者が便利に使用できるツールを提供するために、rake taskを作成することができます。例えば、コードのフォーマットやスタイルチェック、ローカルサーバーの起動、テストの実行などが挙げられます。

  • デプロイの自動化

アプリケーションのデプロイ作業を手動で行う場合、rake taskを作成して自動化することで、デプロイ作業を効率化することができます。

・リリース後のデータ投入

リリース後にデータの投入や変更が必要になった場合、rake taskを作成することで直接本番操作をすることなくデータの変更が可能になります。

Railsにおけるrake taskの作成方法

今回は単純に「Hello World!」と返すだけのrake taskを作成してみます。

新規アプリケーションの作成

% rails new sample-rake-task-app -d mysql
% cd sample-rake-task-app
% rails db:create
  • Ruby: 3.2.0
  • Rails: 7.0.4.3
  • DB: MySQL

taskの作成

% rails g task hello_world

 

上記のコマンドを実行することで、lib/tasks配下にhello_world.rakeというファイルが新規作成されます。

ファイル階層

rakeファイルの編集

作成されたhello_world.rakeを見ると以下のようになっています。

namespace :hello_world do
end

 

これを以下のように編集します。

namespace :hello_world do
  desc "Hello Word!を返す"
  task :greeting do
    puts "Hello world!"
  end
end

namespaceはタスクの名前空間を定義するための名前です。

名前空間を定義することで、タスクをグループ化し、複数のタスクをまとめて管理することができます。名前空間を定義しなくても、直接タスクを定義することができます。今回は「hello_world」を定義しました。

descメソッドはタスクの説明を定義するためのものです。

この説明はrake -Tコマンドで表示されます。説明は必須ではありませんが、タスクを読みやすくするためにも記述することをおすすめします。今回は「Hello World!を返す」という説明を記述しました。

taskメソッドは実際にタスクを定義するためのものです。

このメソッドにはタスク名とタスクが実行されたときに実行されるコードブロックを指定する必要があります。今回は「greeting」という名前のタスクを定義しました。

rake taskの実行

以下のコマンドを実行することで先ほど作成したrake taskが実行され、「Hello World!」がコンソール上に出力されるはずです。

% rake hello_world:greeting
=> Hello world!

(RSpec)rake taskのテスト

先ほどのテストをRSpecでテストを書くと以下のようになります。

# spec/lib/tasks/hello_world_spec.rb

require 'rails_helper'
describe "hello_world:greeting" do
  subject(:task) { Rake.application['hello_world:greeting'] }

  it "returns 'Hello World!'" do
    expect { task.invoke }.to output("Hello World!\n").to_stdout
  end
end

RSpecでrake taskをテストするには設定が必要になります。

rails_helper.rbを以下のように変更しましょう。

RSpec.configure do |config|
  config.before(:suite) do
    Rails.application.load_tasks #全てのrakeタスクを読み込む
  end

  config.before(:each) do
    Rake.application.tasks.each(&:reenable)
  end
end

 

config.before(:suite)は全てのテストが実行される前に実行されるフックです。この中でRails.application.load_tasksを呼び出して、すべてのrake taskを読み込んでいます。これによりrake taskがテスト中に使用できるようになります。

config.before(:each)は各テストが実行される前に実行されるフックです。この中で、Rake.application.tasks.each(&:reenable)を呼び出しています。これにより、rake taskがテスト間で状態を保持しないようになります。例えば前のテストでタスクが実行された場合、その状態は次のテストに影響を与えないようにタスクを再設定する必要があります。reenableメソッドは、タスクの状態を初期化するために使用されます。

RSpec
【RSpec】before(:suite)/before(:all)/before(:each)それぞれの違いについてまとめてみたRSpecのbefore(:suite)/after(:suite)とbefore(:all)/after(:all)、before(:each)/after(:each)それぞれの違いについてまとめています。それぞれの実行タイミングが異なり、忘れがちな部分でもあるので備忘録としてまとめています。...

まとめ

  • RakeとはRubyで書かれたコードをタスクとして作成しておき、必要に応じて呼び出し実行する事が出来る機能
  • RakeはRubyのビルドツールであり、特定のタスクを実行するためのスクリプトを定義するために使用される
  • Rakeが実行する処理内容をRakeタスクと呼び、定義する場所をRakefileと呼ぶ
  • RakeタスクはRubyコードで記述され、rakeコマンドを使用して実行できる

参考

class Rake::Task

 

今回はタスクを自身で定義し、それを必要な時に実行することができるrake task(レイク タスク)についてまとめてみました。タスクを自分で定義することで、定期的に行う必要のあるタスクや、手作業で行っていた作業の自動化など、開発効率を上げることができるため、積極的に使ってみてください。