読者です 読者をやめる 読者になる 読者になる

詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Play Framework で `rails runner` 的なことを実現する

Play Framework Scala sbt

Play Framework 2.2.x の話です。分かりよいだろうというので rails runner を引き合いに出したのだけど、つまり何をやりたいかというと、アプリケーション本体のコード(Play も含めて)を利用して、オペレーションやメンテナンス用のタスク(バッチ処理)を書きたい。初心者なのでフレームワークに乗っからないとデータベースへの接続もできないのです。

適当に Scala の object を作って sbt runMain してやれば任意のコードを実行することはできるけれど、最終的にビルドしたときにアプリケーション本体には含めたくないので、分けて置いておきたい。フレームワークにそういうサポートがあるのじゃないかと考えていろいろ調べてみたけれど結局わからなかったので、こういう風にやってみた。

  • "tasks" というディレクトリを作り、ここに実行したいタスクを main() を備えた object として書く。
  • sbt の設定(build.sbt)で、tasks という、ルートプロジェクトに依存したサブプロジェクトを定義する。
  • 個々のタスクは sbt 'tasks/runMain {taskObject} {args}' で実行する。

不完全な例を挙げると、以下のようになります:

`rails runner` in Play framework

ウェブアプリケーションとして稼働していない場合に Play の API を叩きたいときには、play.core.StaticApplication というのを使えばよいらしいです。また、暗黙の Application を導入するために current をインポートするのと、最後に Play.stop() するのを忘れずに。