bin/rails runner
Railsのクラス群を読み込んだ状態でコードを実行するコマンド。
以下のようなコードがあるとする。
# app/models/user.rb
class User < ApplicationRecord
def self.calc
puts 10 + 100
end
end
上記のコードがある状態で、bin/rails runner User.calcを実行すると以下のような出力になる。
Running via Spring preloader in process 5062
110
bin/rails runner ファイルという形で実行することもできる。あくまで例として以下のようにファイルを書き換えて実行してみる。
# app/models/user.rb
class User < ApplicationRecord
def self.calc
puts 10 + 100
end
end
User.calc
bin/rails runner app/models/user.rbを実行すると以下のようになる(2回出力されているのは、runnerでの実行の前にクラス読み込みのタイミングで実行されているせいと思われる)。
Running via Spring preloader in process 5162
110
110
runnerコマンドで指定するコードをどこにおくかであるが、libディレクトリ以下に格納することが多いようである。
lib/batch/maintenance.rbにBatch::Maintenance.runクラスメソッドを作ったとしても、デフォルトではオートロードのパスに含まれないのでbin/rails runner Batch::Maintenance.runとしてもエラーになる。
ロードパスに追加するためにconfig/application.rbに以下を追加する。
config.paths.add 'lib', eager_load: true
ロードパスの追加に関しては、以下を参照。
- autoload pathsを拡張するとき、eager_loadについて覚えておいてください(日本語訳) - FreeDrop
- 元記事:Don’t forget about eager_load when extending autoload paths | Arkency Blog
ロードパスの変更が反映させるために、bin/spring stopコマンドを実行しておく。
実行環境を指定したい場合は、bin/rails runner -e staging Batch::Maintenance.runのようにする。