こんにちは、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に渡しちゃいます。





