uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

Grails on GAE/Jを試してみた

Grails AppEngine Pluginを使って、GAE上のGrailsアプリをleftoversさんのところを参考にしてつくってみました。

いや未完成どころか、ただの断片ですけどね。事前に「DIとAOPも削りました」と言う話も聞いていたので、動くのはもっと先の話か思ってましたが、あっけなく動いたなあという印象。いやもちろん凄い苦労してるのかもしれませんが。Google側の協力とかもあったんでしょうか。(GroovyチームとGAEチームとの間では事前に協力しての検証作業があったみたいね)。

上記まで持ってくのにはまったところや留意点、あるいは単に知らなかったので苦労した点(MacOSXでですが、あまりOSには依存しないことかも):

  • githubからGrails 1.1.1 SNAPSHOTを取得してブランチを設定するには以下のコマンドラインを実行する(あ、gitが入ってることは前提ね)。Pluginのページにあるgitコマンドラインは私のところでは期待するように動かなかった。
git clone git://github.com/grails/grails.git
cd grails
git checkout -b app-engine origin/app-engine
  • Grailsをソースからコンパイルする際には、(環境にもよると思いますが)メモリがたりなくなるので環境変数ANT_OPTSに「-Xmx128m」とかを設定する。
env ANT_OPTS=-Xmx128m ant/bin/ant clean jar
  • JDO対応のscaffoldはしてくれない。自力でなんとかする必要がある。
  • JDO対応じゃなくてもいいからとにかくベースラインとしてscaffoldしようとすると、grails generate-views/controllersする際に「com.google.appengine.api.datastore.Key」クラスがないと言われるので、GAEのSDK(APPENGINE_HOME/lib/impl/)の方から「appengine-api.jar」を持ってきて/libにおいとく。(「CLASSPATHに通しておく」とかの方がいいかも)
  • ドメインクラスはデフォルトパッケージにはおけない。何らかのパッケージ配下におく必要がある。
  • ローカル実行するためには、以下を修正しておく。
diff ~/.grails/1.1.1-SNAPSHOT/projects/test20090419/plugins/app-engine-0.5/scripts/_Events.groovy _Events.groovy~
13d12
< 	<sessions-enabled>true</sessions-enabled>
  • ローカルではCSSがうまく適用されない。SiteMeshが動いてないのか?単なるURLの不一致か?謎である。この問題は未解決。

以上、リリース版ではないのでいらん苦労が多かったですが、scaffoldとJDOの話以外は比較的マイナーな問題なので、割とすぐに問題なくなるのではないかと思いました。JDOはちと低レベルっぽいので中期的にはJPA対応になってほしいですが、いずれにせよBitTable上でスケーラブルにアクセス可能なデータとして扱えるのかが気がかり。ある場合にはドメインクラスがMemcacheサービス上に永続化する仕組みも必要なのではないだろうか。

あとはたぶん以下が待ち望まれる。

  • GAEの定期タスク処理を実行できるバッチプラグイン
  • Googleアカウントに対応する認証認可
  • (追記)GAE/JのストレージAPIを、MOPを駆使してエンティティを記述するDSL(を実現するプラグイン)。BigTableスキーマレスで値の型も自由だから、動的言語が向いているはず。