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

愛と勇気と缶ビール

ふしぎとぼくらはなにをしたらよいか

GAE/J上でJRuby+Sinatra+DataMapper環境を整えてやりたい放題でござる の巻

だいーぶ前に、GAE/J上でRubySinatraっていうWebフレームワークを動かす方法を少し丁寧に説明したのですが、時代が進んでいたので更新。


ちなみに前回のよりもめったんこ簡単に、前回よりリッチな以下の環境を実現できます。

  • RubyのイカすWebフレームワークであるSinatraがGAE/Jで動く。
  • RubyのイカすO/Rマッパ的なものであるDataMapperがGAE/J上で動き、データを好き放題永続化できる。
  • ついでにGAE上から好き放題、外部に対するhttp接続ができる。

ここ読んで。

http://code.google.com/p/appengine-jruby/




ハイ読んだ。終了。





だけではあまりに寂しいので、少し解説する。



1、導入

gem install google-appengine


2、プロジェクト作成

mkdir test
cd test
dev_appserver.rb .


本来ならば、GAE/Jで動作するアプリケーションのテストおよびデプロイには配布されている開発環境に同梱されている dev_appserver.sh と appcfg.sh を使う。でも、先ほどのgemをインストールするとそれらをRubyでwrapしかつ機能追加したモンがインストールされるのでそれを使います。


追加されている機能としては、

  • 起動時にWEB-INF以下に必要なものども(appengine-sdkやらjrubyやらjruby-rackやら)をコピー
  • Gemfileに記述したgemを、WebからDLして自動的に同梱

などがあります。GAE/J上でgemを使うためにはプロジェクトのどこかのディレクトリにgemをインストールし、それらを同梱したプロジェクトをまるごとGAEにアップロードする必要があるのですが、このwrapperを使うとその部分を勝手にやってくれます。超便利。




3、作成

ここに書いてある通りにするだけ。

http://code.google.com/p/appengine-jruby/wiki/GettingStarted


config.ruにGAEのアプリケーションIDを書いておくと、自動的にappengine-web.xmlが生成される。


要は、config.ru書いて、Sinatraの部分書いて(例ではguestbook.rb)、viewsっていうディレクトリ作ってそこにテンプレート置くだけ。あと、デフォルトのGemfileでは


gem dm-appengine
gem sinatra


の部分がコメントアウトされているので、コメントイン。(?)


あと、gem appengine-apis を追記しといてちょ。




4、デプロイ

appcfg.rb .




終了。




appcfg.rbを使うと多少デプロイが遅くなるので、appcfg.rbのファイルコピー機能がいらない場面ではappcfg.shを使うといいかもしれない。


この方法でGAE/Jで動くSinatraアプリを用意すると、以下の利点がある。



1、簡単にデータの永続化が可能


GAEではRDBが使えないからデータの永続化めんどくさそう…な人も、DataMapperでラクラクDataStoreにアクセス可能。



2、簡単に外部に対するhttp接続が可能


ここでappengine-apisが絡んでくる。


GAEでは外部への通常のhttp接続の代わりにGoogle様の用意されたurlfetchとかなんとかを使う必要があるのだが、gem appengine-apisをGemfileに追記した上で


require 'appengine-apis/urlfetch'

Net::HTTP = AppEngine::URLFetch::HTTP


と、http通信を必要とするファイルに書くておくと、


なんと、RubyのNet::HTTPライブラリがそのままGAE上で使えるようになる。要は、Net::HTTPの中身が、urlfetchを使ったものに置き換わる。



これでマッシュアップもばっちりね!


(※ Gemfileに追記せずに、require 'appengine-apis/local_boot' でもいけるっぽい?ローカルの場合に)



3、gemのインストールがかんたん


これもう書いた。




まあそんなわけで、だいぶ簡単に、データの永続化やらがGAE/JRubyでも可能になっております、というお話でした。



みんなも試してア・ラ・モードっ☆