GAEでsinatraとDataMapperを使うまでのメモ(バージョン関連ではまる)

Google App Enginesinatraと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の開発環境(デプロイ環境)を整える

Eclipseプラグインがあるようですが、まずはコマンドラインでどんなことをする必要があるかを覚えました。

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を使用します。
windowsMacLinuxで共通して使用できます。cmdとshそれぞれスクリプトが同梱されています。

好きな所に展開しパスを通しておきます

Mac

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からコピーしてきます。

MAC

cp /appengine-java-sdk-1.2.5/lib/user/appengine-api-1.0-sdk-1.2.5.jar ~/sinatra_on_gae/WEB-INF/lib/

Windows

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.xmlhogehoge要素を書き換えます。

http://hogehoge.appspot.com

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のファイル数の上限がある為できるならやっておきたい