ぱろっと・すたじお

技術メモなどをまったりと / my site : http://parrot-studio.com/

GAEでJRubyのSinatraを動かすまでのメモ

業務でGoogleAppEngineを使うかもしれないので、
最近いろいろ調査してました
特に、GAE/JRuby周りを中心に


一応、私はJava屋でもあるので、
GAEが正式サポートしているJavaでコードを書いてしまってもいいのですが、
Rubyの簡便さに慣れるともう戻れないのです(*ノ∀ノ)


というわけで、GAEのJVMの上で動くJRubyの調査をしていたのですが、
Railsだと相当面倒というか、情報が古くてほとんど断念


その代わり、「Sinatra」という軽量フレームワーク*1なら動作を確認できたので、
とりあえずそれを動かすまでの手順をメモ...φ(・ω・`)


参考にしたのはこちら(´・ω・)っ


appengine-jrubyで簡単GAE/JRuby開発 - しばそんノート


ほとんどこのままやっていけばOKですが、
微妙に手順が変わっているところがあったのです

Sinatraを使わないHello World

0.準備
  • (C)rubyのインストール(JRubyではないので注意)
  • gemのインストール
  • OpenJDKのインストール(別にSun Javaでもいいと思いますが、面倒だったので)
  • GAEのアカウント取得
1. google-appengineをインストール
gem install google-appengine

CRubyのgemで問題ありません
関連するSDKJRubyなども一緒に入ります

2. config.ru を作成


先ほどのサイトを参考に、IDとVERだけきっちり修正

3. 開発サーバで動作確認
dev_appserver.rb [--address=0.0.0.0] [--port=xxxx] .

※0.0.0.0を指定しないと外部からアクセスできない
※portは任意(現Verでは8080がデフォルト)

初回実行時、関連するgemのダウンロードと配置が行われます
rubyのgemでインストールしてあっても、GAE/JRubyでは動きません
(デプロイされないため)


・・・そこまではいいのですが、
問題はこれをローカル権限で実行できないことでして
(ここで詰まった)


というのも、私はgemをroot権限で実行しているためか、
gem以下の dev_appserver.rb の権限がrootになっていたのですΣ(・ω・ノ)ノ


これの権限をいちいち修正するのも面倒なので、そのままrootで起動しました
何かうまい手はないかな・・・

4. GAEにデプロイ
appcfg.rb update .

これだけでデプロイが開始され、
初回のみアカウント情報を要求されます
次回からはコマンドだけです

SinatraHello World


ここまでの実行をやっている、という前提で

1. Sinatraアプリを作る


さっきのサイトを参考に
私はほとんどコピペで試しました


この段階で、普通のSinatraアプリとしてテストしておくといいと思います
「config.ru」とアプリのファイルを同じディレクトリに置いて、
ruby xxxx.rb」するだけです


おそらくデフォルトでWEBRickが起動し、
アクセスできるはずです
つまり、たった2ファイルで動いてしまうという・・・(; д ) ゚ ゚

2. Gemfileの書き換え


詰まったのがここです
先ほどのサイトでは、appcfgを経由してgem installしているのですが、
最新のgoogle-appengine-0.0.6では手順が変わっています


おそらく、作成したアプリケーションのディレクトリに、
「Gemfile」というファイルがあるはずです
これに以下を追記します

(前略)
gem "appengine-rack" # これはおそらくある
gem "sinatra"        # コメントで存在するかも?

要は、Gemfileにアプリで使うgemを指定すればいいのです(`・ω・´) b


最初アプリが起動しなくて、いろいろ試行錯誤した結果、
「#gem "sinatra"」という行が追加されていたので、
何かのタイミングで書き込まれたのかもしれません

3. 動作確認


dev_appserverでサーバを起動します
おそらくはSinatraが実行環境にインストールされます

4. GAEにデプロイ


さっきと同じです



実際に動かすまでをやってみると、GAEでRubyが動いたってことよりも、
RackとSinatraの簡便さに驚きました
引き続き、Sinatraを調査する予定です

*1:関連してRackのことを調べてみたのですが、RailsよりもむしろRackを知っていた方が応用できる気がします