大ちゃんの駆け出し技術ブログ

RUNTEQ受講生のかわいいといわれるアウトプットブログ

【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ドキュメントでは以下のようにて説明しています。

Rubyで記述されたビルドツール Rails5以降はrailsコマンドでrakeを呼び出せるようになっています

railsdoc.com

短いし説明が全然されていないのであんまり理解できませんでした、、、

Rails5以降ではrailsコマンドでrakeコマンドを呼び出せる仕様になっていることから、現在rakeコマンドはrailsコマンドの一部になっているという理解で良さそうです。よって$ rails routesも元々はrakeコマンドの機能だったということです。しかしもっと説明が欲しいですね笑

次にTechAcademyマガジンの説明を引用します。

Linux環境でにおけるビルドツールとしてmakeがありますが、実はRubyにおいてもビルドツールがあります。それがRakeです。Rakeを使うとRakefileに一連の処理として定義されたタスクを実行することができます。

techacademy.jp

ビルドというのはプログラミング言語において、テキストファイルに従った処理を実行することです。わかりやすくいうと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の記事で詳しく説明されています。説明する量が多いため、詳しく知りたい方は記事を参照してください。

qiita.com

記事が難しいと思った方のために雑に説明すると、: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タスクを自分で定義する方法について発信します!

以上、大ちゃんの駆け出し技術ブログでした!

参考文献

Rake | Railsドキュメント

RubyのRakeライブラリについてを現役エンジニアが解説【初心者向け】 | TechAcademyマガジン

Rails における rake タスクの :environment について - Qiita