[Rails 5] rakeタスクがrailsコマンドでもできるようになった

こんにちは、hachi8833です。BigBinaryシリーズ第3弾をお送りいたします。Rails 4以前で使い分けの面倒だったrakeコマンドがRails 5ではrailsコマンドで実行できるようになっています。 元記事 Rails 5 brings consistency by wrapping all rake commands using rails(米国BigBinary社のブログより) 確認に使った環境 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に渡しちゃいます。 関連記事(BigBinaryシリーズ) [Rails 5] Rails 5の新フレームワークデフォルト設定ファイルでアップグレード作業を軽減する [Rails 5] マイグレーション時にデータベースのカラムにコメントを追加する