Tech Racho エンジニアの「?」を「!」に。
  • 開発

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

こんにちは、hachi8833です。BigBinaryシリーズ第3弾をお送りいたします。Rails 4以前で使い分けの面倒だったrakeコマンドがRails 5ではrailsコマンドで実行できるようになっています。

元記事

確認に使った環境

Rails 5ではrakeタスクをrailsコマンドで実行できるようになった

注: この記事ではコマンド実行時にbundle execのbashエイリアスとしてbeを追加しています。このエイリアスをbashに設定していない場合はbundle exec rails./bin/railsのように実行してください。

Rails 4以前

Rails 4以前は、各種コマンドがrailsrakeに分散していました。

データベースのマイグレーションは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コマンドのupdatetemplateで指定する名前空間が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シリーズ)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。