こんにちは、hachi8833です。BigBinaryシリーズ第3弾をお送りいたします。Rails 4以前で使い分けの面倒だったrake
コマンドがRails 5ではrails
コマンドで実行できるようになっています。
元記事
確認に使った環境
- Rails 5バージョン: 5.0.1(5-0-stable)
- Rubyバージョン: 2.4.0p0
Rails 5ではrakeタスクをrailsコマンドで実行できるようになった
注: この記事ではコマンド実行時にbundle exec
のbashエイリアスとしてbe
を追加しています。このエイリアスをbashに設定していない場合はbundle exec rails
か./bin/rails
のように実行してください。
- このあたりについて詳しくはTechRacho記事「【翻訳+解説】binstubをしっかり理解する: RubyGems、rbenv、bundlerの挙動」をどうぞ。
Rails 4以前
Rails 4以前は、各種コマンドがrails
とrake
に分散していました。
データベースのマイグレーションはrake db:migrate
でしたし、scaffoldなどを行う場合はrails generate scaffold ...
といった具合でした。
rake
はRuby自身の標準ツールですが、そのためにプロジェクトディレクトリでrake --help
を実行しても普通のヘルプしか表示されず、Railsならではの実行オプションは表示されません。
さらに、rake
では値を引数で渡すのも面倒になりがちです。
Rails 5以後
同記事によると、rake
コマンドを好む開発者も多い中、Railsコアチームはrake
でできるタスクをrails
でもできるようにする決定を下したとのことです。もちろん従来どおりrake
コマンドで実行することもできますので、rake
に慣れた開発者も戸惑わずに済みます。
たとえばルーティングの確認によく使われているrake routes
は、Rails 5ではrails routes
で実行できます。もっともRubyMineなどのIDEがあればそれほど使わないかもしれません。
そのためにRails 5ではRake Proxyが導入されました。rails
にないオプションが指定されるとこのRake Proxy経由でコマンドをrake
に委譲するようになっています。
rails --help
を実行すると、従来rake
で実行できたオプションも続けて表示されます。たぶんこれが一番ありがたいと思います。
追加情報1: rails
コマンドの名前空間が一部変更された
Rails 5では上述の変更に伴い、railsコマンドの
updateと
templateで指定する名前空間が
railsから
appに変更されています。Rails 5で以前の
rails rails:update`などを実行するとdeprecation warningが表示されます。
# Rails 4以前
$ rails rails:update
$ rails rails:template
$ rails rails:templates:copy
$ rails rails:update:configs
$ rails rails:update:bin
# Rails 5以後
$ rails app:update
$ rails app:template
$ rails app:templates:copy
$ rails app:update:configs
$ rails app:update:bin
追加情報2: rails routes
の-gオプションでgrep、-cオプションでコントローラをgrep
Rails 5のrails routes
コマンドにgrep用の-gオプションが追加されました(#18902: rails routes -g pattern to search for specific routes )。
また、-cオプションを渡すとコントローラ名で絞り込めます(#20420: Add options for rake routes task)。
もっとも私ならとっととpecoに渡しちゃいます。