Ruby on Rails で利用できる rake task 作成方法
本ページでは Ruby を導入する際に自動でバンドルされてくる rake を Ruby on Rails上で利用する際の利用方法について解説します。
Rakeについて#
Rakeとは、Ruby を入れると自動で入ってくるもので、 何かしらのジョブを定義して実施できるようにしたもののようです。
リファレンスマニュアル には以下の記述があります。
Rake は Make によく似た機能を持つ Ruby で書かれたシンプルなビルドツールです。
Makeによく似たビルドツール、と書かれるとコンパイル向けの何かかと思ってしまいそうですが、Railsで利用する分にはビルドツールというよりも何かしらのタスクを定義して、それを実行させるものです。
Railsではどのように利用するかというと、Railsのサーバと連携した定型処理を行いたいときに利用します。例えば定期的なDB更新ジョブなどに利用されます。
Ruby on Rails 向けのrake task作成#
rails の generate コマンドによりrake task の作成が可能です。
bin/rails generate task <namespace> <task_name>
# または以下の短縮形
bin/rails g task <namespace> <task_name>
namespace は関連するタスクをまとめて管理するためのフォルダのようなもので、既存のものと被らないようなものを指定してください。
例えば、 my_task という namespace で first_task を作成するには以下のコマンドを実行します。
bin/rails g task my_task first_task
これによりタスクファイルが lib/tasks に作成されます。
Taskの中身を書いていく#
上記のコマンドを打った後に lib/tasks/my_task.rake が作成されました。このファイルはそのままだと以下のような内容になっています。
namespace :my_task do
desc "TODO"
task first_task: :environment do
end
end
task としての構造は生成してもらったので、後は中身を記述する必要があります。
ひとまず、 今回は Model というモデルの name を参照してコンソール出力するだけのタスクを書いてみます。以下のような内容になります。
namespace :my_task do
desc 'My first task' # ここにタスクの説明を書く
task first_task: :environment do
# task の中に実行したい内容を記述
models = Model.all
models.each do |model|
puts model.name
end
end
end
これにより first_task の中身を記述することができました。
上記では :my_task という namespace の中に 1つのタスク first_task が定義された形になります。
作成した task がきちんと認識されるかを見るためには rake taskを一覧表示することができる bin/rake -T コマンドを利用します。
以下はコマンドを実行した際の出力の一部です。
> bin/rake -T
... (省略) ...
rake middleware # Prints out your Rack middleware stack
rake my_task:first_task # My first task
rake restart # Restart app by touching tmp/restart.txt
... (省略) ...
このように、 rake my_task:first_task が見えていれば問題なく task が作成されています。きちんと右側のコメント欄に desc で記述した内容も出力されていることがわかります。
実行してみる#
タスクが rake に認識されれば、後は rake により実行するだけです。
bin/rake my_task:first_task
上記コマンドによって my_task という namespace 内の first_task というタスクを実行しています。
出力内容を見てみると、記述した通り、DB上に Model として保存されているレコードから name のカラムを引っ張り出してきて puts によりコンソール出力されることが確認できます。
応用先 - どのようなことに使うか?#
利用先としては以下のようなものが考えられます。
管理側が実行する便利コマンド
whenever などを利用した定期的なタスク実行
特に後者の定期的なタスク実行はDBの監視や定期的な情報のUpdateなどに利用できるため、利用する機会は多いのではないかと思います。