GAEでsinatraとDataMapperを使うまでのメモ(バージョン関連ではまる)
Google App EngineでsinatraとDataMapper(のDataStore)を使えるようにするまでに結構苦労したのでメモです。
はまったところ
- 2009年9月24日現在はJPサイトではSDKは1.2.0でENでは1.2.5
- デプロイするSDKとWEB-INF/libのSDKのバージョンは同等とする
- 1.2.5で揃えたらうまくいった
- DataMapperの新しいバージョンが最近リリースされたがreadが実装されていないと例外が発生する
- 0.9.11を指定してバージョンを落とすと動いた(そのうち新しいバージョンも対応されると思います)
- DatastoreNeedIndexException例外が発生してDataStoreが使えない
- SDKの1.2.5を使ったらいけた。
- 管理画面→Datastore→Indexesで『Building』が表示されればそのうちインデックスが作成される(10分くらい)
DataStoreを利用するまでの手順
Google App Engineの開発環境(デプロイ環境)を整える
1)GAEの開発を行う為のSDKをダウンロードする
- 1.2.0 => 日本語サイトで公開されているバージョン
- 1.2.2 => つい最近まで英語サイトで公開されていたバージョン
- 1.2.5 => 英語サイトで公開されている最新バージョン(9月24日現在)
http://googleappengine.googlecode.com/files/appengine-java-sdk-1.2.5.zip
今回は1.2.5を使用します。
windows・Mac・Linuxで共通して使用できます。cmdとshそれぞれスクリプトが同梱されています。
好きな所に展開しパスを通しておきます
export PATH=$PATH:/appengine-java-sdk-1.2.5/bin
Windows
マイコンピュータを右クリック→詳細設定タブ→環境変数→システム環境変数→Path
にセミコロン区切りで展開したSDKのパスを指定する「etc...;c:\appengine-java-sdk-1.2.5\bin」
2)GAEでsinatraを動かす
jugyoさんのエントリーかid:muscovyduckさんのエントリーを参考に環境を構築します。
とりあえず動かしてみたい方は、jugyoさんのgithubに公開されているサンプルをリポジトリからダウンロードします。(またはgitでclone)
Cドライブ直下(またはホームディレクトリ)に展開します。
3)必要な設定とファイルを置き換える
最初にWEB-INF/libにあるppengine-api-1.0-sdk-1.2.0.jarを削除します。
SDKのバージョンを1.2.5に統一するので、jarファイルをSDKからコピーしてきます。
cp /appengine-java-sdk-1.2.5/lib/user/appengine-api-1.0-sdk-1.2.5.jar ~/sinatra_on_gae/WEB-INF/lib/
copy C:\appengine-java-sdk-1.2.5\lib\user\appengine-api-1.0-sdk-1.2.5.jar C:\sinatra_on_gae\WEB-INF\lib\
次に
WEB-INF/appengine-web.xmlの
GAEで事前に取得したapplication名のhogehogeがそれにあたります。
4)ローカルでとGAEにデプロイでsinatraの動作確認
ローカルで動作確認
dev_appserver.sh --address=0.0.0.0 -p 3000 ~/sinatra_on_gae/
GAEにデプロイ
appcfg.sh update ~/sinatra_on_gae/
DataStoreを使用する
1)ライブラリをインストールする
Sinatraの動作確認ができたら、次はDataStoreを使用したいと思います。
BigTableのデータストの操作を行う為のライブラリはDataMapperが利用できます。
DataMapperの良い所としては、SQLiteへの切替えなどアダプタやプラグインが充実している事。
GitHUBで最新情報を追う事ができます。
このDataMapperの設定で一番苦労したのですが、現在リリースされている0.10だとREADメソッドが実装されていないとエラーになってしまいました。バージョンを1つ前の0.9.11を指定してインストールする事で、問題なく使用できるようになりました。
$pwd $~/sinatra_on_gae/ $gem install -i WEB-INF/gems data_mapper --version '0.9.11' --no-rdoc --no-ri Successfully installed addressable-2.0.2 Successfully installed extlib-0.9.13 Successfully installed data_objects-0.9.12 Successfully installed dm-core-0.9.11 Successfully installed dm-aggregates-0.9.11 Successfully installed dm-migrations-0.9.11 Successfully installed dm-serializer-0.9.11 Successfully installed dm-timestamps-0.9.11 Successfully installed dm-validations-0.9.11 Successfully installed dm-cli-0.9.11 Successfully installed dm-is-tree-0.9.11 Successfully installed dm-observer-0.9.11 Successfully installed dm-types-0.9.11 Successfully installed data_mapper-0.9.11 14 gems installed
これでDataMapperの関連依存関係ライブラリを含めてインストールが完了しました。
データストア用のAdapterは別途インストールします。
http://d.hatena.ne.jp/mizincogrammer/20090707/1246941205を参考に
cd WEB-INF/lib git clone git://github.com/genki/dm-datastore-adapter.git cd dm-datastore-adapter/lib/ jar cf ../../dm-datastore-adapter.jar . cd ../../ rm -rf dm-datastore-adapter
を実行します。
既にdm-datasotre-adapterがjar化されているので、それをそのまま使おうということですね。
自分でgemをjar化したい場合は*1、dm-datastore-adapter作者の瀧内さんのこのエントリーを見ると良いと思います。
これで、環境構築は完了です。
2)DataMapperを利用する
DataMapper自体の使い方はのサイトを見ると詳しく載っています。
http://datamapper.github.com/
http://datamapper.org/
DataMapperを使用する為に、app.rbを書き換えます。
サンプルはまたid:mizincogrammerさんのエントリーを参考に変更します。
require 'rubygems' require 'sinatra' require 'dm-core' require 'dm-aggregates' require 'dm-types' require 'dm-datastore-adapter/datastore-adapter' DataMapper.setup(:datastore, :adapter => :datastore, :database => 'sinatratest') class Post include DataMapper::Resource def self.default_repository_name; :datastore end property :id, Serial property :body, Text property :created_at, DateTime before :save do self.created_at = Time.now end end get '/' do body = <<-HTML Hello Sinatra on JRuby World!!<br /> <form method="POST"> <input type="text" name="post[body]" /> <input type="submit" value="post" /> </form> Posts:<br /> HTML Post.all(:order => [:created_at.desc]).each do |post| body += "<div>id:#{post.id} body:#{post.body} created_at:#{post.created_at}</div>" end body end post '/' do Post.create(params['post']) redirect '/' end
これで、ローカルでもGAEにデプロイしてもデータストア利用の動作確認ができると思います。
現時点でのJruby + Google App Engine + Sinatra + Data Mapperの環境構築とサンプル作成が完了です。
まとめ
- ライブラリ確認大事
- 環境設定は思ったより設定箇所が少ない
- 先人のトライ情報はとてもありがたかった
最後になりましたが、GAE関連の情報は今はまだ多くなくお手軽ではないですが、やってみたら思っていた以上に面白かったです。自分の失敗をこうやって書き残すことで、他の方の少しでもお役に立つことがあればいいなぁ。GAE・DataMapperとも更新が頻繁に行われるので、GitHUBで追いかけるなど最新の情報を確認するのが現時点では必須だなと感じました。
*1:GAEのファイル数の上限がある為できるならやっておきたい