sudo -u grails

Grailsの記事が充実する。といいなぁ

Grailsでrun-scriptコマンドを使って任意のGroovyスクリプトを走らせ、その中でServiceを使う

Grailsには、create-scriptコマンドを使ってscriptsディレクトリ配下にGantスクリプトを作り、任意のGrailsコマンドを追加する機能があります。

scriptsディレクトリ配下のGantスクリプトはGrailsコマンドとして実行可能になるため、 scripts/MyScript.groovy を作ったら、 grails my-script コマンドとして実行できますね。

では、run-scriptコマンドはご存知でしょうか?

このコマンドは、任意のGroovyスクリプトを、Grailsのコンテキストを与えた上で実行可能にするコマンドです。Grails 1.3.6の頃からあるようです。

このコマンドは

> grails run-script src/groovy/package/MyScript.groovy

のように、実行するGroovyスクリプトを指定して実行します。このGroovyスクリプトの中では、Grailsのドメインクラスをそのまま利用することができます。

new MyDomain(str:"テストです").save()
println MyDomain.count()

では、Serviceを使うにはどうするか?run-scriptしたときには、 applicationContext が無くて applicationContext.getBean('myService') みたいなことをさせて貰えません。ここはGrails本体の scripts/RunScript.groovy を覗いてみましょう。

def shell = new GroovyShell(classLoader, new Binding(ctx: appCtx, grailsApplication: grailsApp))

なんていう行がありますね。どうやらrun-scriptのときのApplicationContextは変数ctxに入っているようです。

def my = ctx.getBean('myService')
my.method()

これでServiceも呼べますね!GrailsApplicationが必要なら grailsApplication に入っているので、これも覚えておくと良いでしょう。Gantを書くより手軽に定型的な処理を書き出しておけるので、いろいろと使い道がありそうです。