ずっと君のターン

2009-04-28 最近また夜が寒いっすね

たぶん一番かんたんなRails on GAE/J

| 02:28 | たぶん一番かんたんなRails on GAE/Jを含むブックマーク

rails APPNAME -m http://gist.github.com/103256.txt

いろいろまとめてプラギン化した上で、アプリケーションテンプレートもご用意致しました。瀧内さんとこ参考にRailsをjarにまとめてあるのでファイル数制限も余裕で回避。あれこれ結構がんばった。

GAE/Jのアカウントが手に入ったみんなはコレ使って遠慮なくGoogleクラウドでRailsすればいいと思う。手に入ってない人も今のうちに開発サーバーで動かしとけば、5月末のGoogle I/Oできっと一般公開されるよ。

てことで以下手順。

必要なライブラリを入れる

GAE/JのSDKとJRubyとRailsとWarblerは流石に事前に必要。この辺参考にどうぞ。すでにこれらが入ってる人はもちろん飛ばしてよし。

一応参考までに自分では試さずに書くけど、多分こんな感じ。

$ svn co http://svn.codehaus.org/jruby/trunk/jruby jruby
$ cd jruby
$ mvn
$ set JRUBY_HOME=xxx
$ set PATH=$PATH:$JRUBY_HOME/bin
$ jruby -v
jruby 1.3.0 (ruby 1.8.6p287) (2009-04-09 r6586) (Java HotSpot(TM) Client VM 1.5.0_16) [i386-java]
$ jruby -S gem install-v=2.3.2 rails -y --no-ri --no-rdoc
$ jruby -S gem install warbler -y --no-ri --no-rdoc

GAE SDKのbinにPATH通すのも忘れずに。

アプリケーション名を決める

AppEngineコンソールでアプリ名を取得。まだJavaアカウントがなくてローカルで試すだけの人はこの項は飛ばしてOK。

アプリケーションテンプレートを指定してrailsコマンド実行

環境変数GEM_HOMEがあると失敗することがあったので消してから。(アプリ名はrog)

$ unset GEM_HOME
$ rails rog -m http://gist.github.com/103256.txt

Rails on GAE/Jとしては以上で終了。多分動く。

・・・

以下、動作確認兼使い方説明として一行掲示板作ってみる。

モデル作成

実はこのアプリケーションテンプレートにはbumble_modelジェネレータがおまけでついてきてる。まぁ別に大したことやらないけども。

$ cd rog 
$ ./script/generate bumble_model Comment body created_at
$ cat app/models/comment.rb 
class Comment
  include Bumble
  ds :body, :created_at
end

コントローラー作成

これは普通につくるだけ。

$ ./script/generate controller welcome
$ vim app/controllers/welcome_controller.rb 
class WelcomeController < ApplicationController
  def index
    @comments = Comment.all({}, :iorder => :created_at)
  end 

  def comment
    unless params[:body].blank?
      Comment.create(:body => params[:body], :created_at => Time.now) 
    end 
    redirect_to :action => 'index'
  end 
end

ビュー作成

これも普通に作るだけ

$ vim app/views/welcome/index.html.erb
<html>
<head><title>Rails on GAE</title></head>
<body>
<% form_tag :action => 'comment' do %>
  <%= text_field_tag 'body', '', :size => 50 %>
  <%= submit_tag 'Comment' %>
<% end %>
<ul>
  <%- @comments.each do |comment| -%> 
    <li><%=h comment.body %> (<%= comment.created_at %>)</li>
  <%- end -%> 
</ul>
</body>
</html>

ルート設定

普通。

$ vim config/routes.rb
map.root :controller => "welcome"
$ rm public/index.html 
remove public/index.html? y

warに固めて

$ warble war

war自体はいらないんだけど。

開発サーバーで実行して確認

$ dev_appserver.sh tmp/war

http://localhost:8080/

f:id:technohippy:20090429021210p:image

ローカルで確認できたのでデプロイ

$ appcfg.sh update tmp/war

本番で確認

http://4.latest.itrain.appspot.com/

この為にわざわざアプリ名を取るのはいやなのでappengine-web.xmlを修正してアプリ名itrain、バージョン番号4で上げたけど、アプリ自体は上の手順で作ったもの。GAEではDataStoreがバージョンに関わらず共通なので、既にデータがいろいろ入ってるのはご愛嬌

注意

既存アプリには使わないでください。いろんなファイルを直接書き換えるので責任持てません。

Railsのバージョンは2.3.2固定です。

上の手順は私のiMacでしか試してません。うまく行かなかったらコメント欄で聞いてください。

そのままだと動かなかったので付属のRailsは一カ所だけ手を入れてます。もしかしたら何かおかしくなるかも。

actionpack-2.3.2/lib/action_controller/rescue.rb

#RESCUES_TEMPLATE_PATH = ActionView::Template::EagerPath.new_and_loaded(
#  File.join(File.dirname(__FILE__), "templates"))
RESCUES_TEMPLATE_PATH = ActionView::Template::Path.new(
  File.join(File.dirname(__FILE__), "templates"))

matiomatio 2009/06/11 08:32 bumble_model を作ろうとしたとき

/usr/local/jruby/lib/ruby/site_ruby/1.8/builtin/javasupport/core_ext/object.rb:116:in `get_proxy_or_package_under_package': cannot load Java class com.google.appengine.api.datastore.DatastoreServiceFactory (NameError)

とでたので,environment.rb の先頭に

require 'lib/appengine-api.jar'

を追加しました。ローカルでの確認までOKでデプロイしようとしたのですが, jar ファイルのサイズが大きいと怒られてしまいました…。

Reading application configuration data...
2009-06-11 08:16:32.311::INFO: Logging to STDERR via org.mortbay.log.StdErrLog
Beginning server interaction for keitai-link...
0% Creating staging directory
5% Scanning for jsp files.

java.lang.IllegalStateException: Found a jar file too large to upload: "/tmp/appcfg21015.tmp/WEB-INF/vendor/plugins/warbler-0.9.13/lib/jruby-complete-1.3.0RC1.jar". Consider using --enable_jar_splitting.
Unable to upload app: Found a jar file too large to upload: "/tmp/appcfg21015.tmp/WEB-INF/vendor/plugins/warbler-0.9.13/lib/jruby-complete-1.3.0RC1.jar". Consider using --enable_jar_splitting.
Please see the logs [/tmp/appcfg21014.log] for further information.