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を書くより手軽に定型的な処理を書き出しておけるので、いろいろと使い道がありそうです。