以前railsのタスクの書式という記事を書きましたが、railsのタスクが引数がややこしくて、オプションもスマートに使えず余り好きではありません。
Thorでコマンドを書く方が好きなのですが、Thorの中でActiveRecordを使ってDBの操作が出来たのでメモしておきます。
以下はrailsアプリケーションの直下にthor
というディレクトリを作りthor/foobar
にコマンドがある想定のコードです。
railsのautoloadも効くのでthorをGemfileに追加します。
gem 'thor', '~> 0.20'
* @scivola さんにコメントいただきましたがrailties
がthorに依存しているのでGemfileには書かなくても読み込めます。ただし私の環境で試したところrequire 'thor'
を書かないとuninitialized constant Thor
で動きませんでした。
#!/usr/bin/env ruby
require_relative '../config/application'
Rails.application.initialize!
class Main < Thor
desc "exec", "foobar"
def exec
binding.pry
end
end
Main.start(ARGV)
これで
thor/foobar exec
で実行可能です。なんてことは無くてconfig/environment.rb
のコードを丸っと持ってきただけです。なので
RAILS_ENV=production thor/foobar exec
で実行するとproduction
環境で実行可能です。
spring経由で起動してないので起動が重いのが玉に傷です。やり方をちょっと調べてみて、ちなみにspring経由で起動するのにこんなタイムリーな記事があったのですが、残念ながら記事内のリンク先のgithubのリンクが死んでいてコードを見ることが出来ませんでした。spring-commands-rspecも参考になると思ってみてみましたが、私がspringの仕組み自体全く理解してないのでイマイチでよく分かりませんでした。その内調べて分かったらまた共有します。何かご存じの方いらっしゃいまたらヒントでも結構ですのでコメントお願いします!
-- 2019/07/31追記
Thorで引数の解析をしつつspring経由でrailsを読み込む方法を発見したので記事を書きました。
Rails でコマンドラインを書く時の決定版