【Rails】Rakeタスク
はじめに
こんにちは!大ちゃんの駆け出し技術ブログです。
Rubyを学習していると"rake"という言葉に遭遇すると思います。
例えば $ rake routes
は $ rails routes
と同じようにルーティングをターミナル表示してくれます。
$ rake routes Prefix Verb URI Pattern Controller#Action root GET / users#index users GET /users(.:format) users#index POST /users(.:format) ・ ・ 略
そもそもRakeって何なんでしょうか?
Rubyを勉強し始めてなんとなくルーティングを表示できるという理解で留めていたので、今回はRakeについてまとめます。
Rakeとは
Railsドキュメントでは以下のようにて説明しています。
短いし説明が全然されていないのであんまり理解できませんでした、、、
Rails5以降ではrailsコマンドでrakeコマンドを呼び出せる仕様になっていることから、現在rakeコマンドはrailsコマンドの一部になっているという理解で良さそうです。よって$ rails routes
も元々はrakeコマンドの機能だったということです。しかしもっと説明が欲しいですね笑
次にTechAcademyマガジンの説明を引用します。
Linux環境でにおけるビルドツールとしてmakeがありますが、実はRubyにおいてもビルドツールがあります。それがRakeです。Rakeを使うとRakefileに一連の処理として定義されたタスクを実行することができます。
ビルドというのはプログラミング言語において、テキストファイルに従った処理を実行することです。わかりやすくいうとJavaなどがコンパイルなどもビルドの一部に該当します。
このテキストファイルにを読み込んで処理をすることは、アプリケーションの複雑化に伴い人間で管理することが難しくなりました。例えば、ファイルを読み込む順序の工数が膨大になために、手動でファイルを実行すると順番を間違えたりしてしまう恐れがあります。そこで、テキストファイルを自動で読み込むツールが必要となり、そのツールがビルドツールにあたります。
Linux環境ではmakeというビルドツールがありますが、Rubyでも同様にビルドツールがあります。それがRakeということになります。Makeの頭文字をRに変更したということが名前の由来っぽいですね。
Rakeタスク
Rakeがアプリのファイルを自動で読み込んでくれるツールであることは理解できました。
しかし、実際どのような処理を自動でしてくれているのかがわからないですね、、、
実はRakeが自動で行ってくれている処理(これをRakeタスクといいます)はターミナル上で確認することができます。
まず、簡単なアプリを作成します。
$ cd 任意のディレクトリ
$ rails new scaffold_rake
$ cd scaffold_rake
$ rails db:create
$ rails generate scaffold user name:string email:string
$ rails db:migrate
コマンドライン上で以下のコマンドを打ち込んでください。
$ rake -T
たくさんの文字がターミナル上に表示されたかと思います。これらは全て自動でファイルを読み込み処理を行なってくれるRakeタスクです。
rake about # List versions of all Rails frameworks and the environment rake action_mailbox:ingress:exim # Relay an inbound email from Exim to Action Mailbox (URL and INGRESS_PASSWORD required) rake action_mailbox:ingress:postfix # Relay an inbound email from Postfix to Action Mailbox (URL and INGRESS_PASSWORD required) rake action_mailbox:ingress:qmail # Relay an inbound email from Qmail to Action Mailbox (URL and INGRESS_PASSWORD required) rake action_mailbox:install # Copy over the migration rake action_text:install # Copy over the migration, stylesheet, and JavaScript files rake active_storage:install # Copy over the migration needed to the application rake app:template # Applies the template supplied by LOCATION=(/path/to/template) or URL rake app:update # Update configs and some other initially generated files (or use just update:configs or update:bin) rake assets:clean[keep] # Remove old compiled assets rake assets:clobber # Remove compiled assets ・ ・ ・
次にrakeタスクの定義場所を見てみましょう。
今回はrake about
の定義場所を覗きにいきましょう。rake about
は説明部分にある通り、「すべてのRailsフレームワークと環境のバージョンを一覧表示する」処理を行います。
$ rake about About your application's environment Rails version 6.0.3.4 Ruby version ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19] RubyGems version 3.0.3 Rack version 2.2.3 ・ ・ ・
.gitignore
によってエディタで検索できない場合があります。今回に限り.gitignore
の/.bundle
をコメントアウトしましょう。
※通常.gitignore
をコメントアウトすることはありません。今回はRakeタスクの中身を見るために仕方なく行なっています。
.gitignore
# Ignore bundler config. # /.bundle
それではrake about
のファイルを覗いてみましょう。文字検索する場合、検索は「rake about」ではなく、$ rake -T
で表示したrake about
の説明部分にあたる「List versions of~~~」で検索してみてください。
すると以下のファイルで定義されていることがわかりました。
vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.4/lib/rails/tasks/misc.rake
desc "List versions of all Rails frameworks and the environment" task about: :environment do puts Rails::Info end
このファイルから定義箇所の構成はこのようになっています。
desc "Rakeタスクの処理内容の説明" task Rakeタスク名: :environment do 処理内容(Rubyで記述) end
desc
はおそらくですがdescriptionの略でしょうか。処理の説明を記述しています。$ rake -T
で実行すると説明部分が# の後ろに表示されます。Rakeタスク名も表示されていますね。
rake about # List versions of all Rails frameworks and the environment
:environment
の部分ですが、Qiitaの記事で詳しく説明されています。説明する量が多いため、詳しく知りたい方は記事を参照してください。
記事が難しいと思った方のために雑に説明すると、:environment
は必ずrakeタスクの定義では記載します。もし記載しないとエラーが起きてしまいます。試しに削除してみましょう。
desc "List versions of all Rails frameworks and the environment" task about: do puts Rails::Info end
ターミナル上実行すると、SyntaxError
、つまり記述ミスのエラーが出ます。
$ rake about rails aborted! SyntaxError: /Users/sakidendaiki/Downloads/RUNTEQ/for_blog/scaffold_rake/vendor/bundle/ruby/2.6.0/gems/railties-6.0.3.4/lib/rails/tasks/misc.rake:10: syntax error, unexpected do (for block) task about: do
※削除した部分は必ず元に戻しておいてください。
また、railsコマンドでrakeを呼び出せるので、$ rails about
でも同じ処理ができます。
$ rails about About your application's environment Rails version 6.0.3.4 Ruby version ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19] RubyGems version 3.0.3 Rack version 2.2.3 ・ ・ ・
終わりに
以上、Rakeについて説明させていただきました。
今回説明したrake about
以外にもRakeタスクが定義されています。
コマンドを実行したり、ファイルを覗いてみたり、いろいろ調べてみてください。
次回の記事ではRakeタスクを自分で定義する方法について発信します!
以上、大ちゃんの駆け出し技術ブログでした!