2014年4月21日月曜日

Heroku/Play2.2/Scala で Hello, World!

初めて Play と heroku を触って、とりあえず疎通確認までやってみたいってとき、現時点(2014/04/20)のプロダクトでちゃんと動くシンプルな getting started 的な資料が、なかなか見当たらない。

heroku のドキュメントを見ると、Scala 版は Play を使っていないし、Java 版だと Play用の記事はあるもののバージョンが古いので、play newのときに Scala を選択して後は指示通りって感じだと、やっぱりちゃんと動かない。

Play のサイト(日本語版)の方では、scala 用のドキュメントがあるけど、Play 2.2.x じゃなく Play 2.1.5 なので、このままだと動かない。英語版では、一応、2.2.x 用に修正されているようだけど、PostgreSQLとの連携とか後でもいいから heroku との連携だけ確認したいってニーズにはやや冗長。

つうわけで、手短に heroku 上で Play(scala) の HelloWorld を動かしてみる手順をまとめてみた。

============================

■ まず Play プロジェクトを作る。
$ play new helloworld
       _
 _ __ | | __ _ _  _
| '_ \| |/ _' | || |
|  __/|_|\____|\__ /
|_|            |__/

play 2.2.2 built with Scala 2.10.3 (running Java 1.7.0_51), http://www.playframework.com

The new application will be created in /home/xad/devel/workspace/scala/play1/helloworld

What is the application name? [helloworld]
> 

Which template do you want to use for this new application? 

  1             - Create a simple Scala application
  2             - Create a simple Java application

> 1
OK, application helloworld is created.

Have fun!
プロジェクトが生成されるので、以降、helloworld フォルダの中で作業する。フォルダの中身は以下のような感じ。
$ cd helloworld/
$ tree
.
├── README
├── app
│   ├── controllers
│   │   └── Application.scala
│   └── views
│       ├── index.scala.html
│       └── main.scala.html
├── build.sbt
├── conf
│   ├── application.conf
│   └── routes
├── project
│   ├── build.properties
│   └── plugins.sbt
├── public
│   ├── images
│   │   └── favicon.png
│   ├── javascripts
│   │   └── jquery-1.9.0.min.js
│   └── stylesheets
│       └── main.css
└── test
    ├── ApplicationSpec.scala
    └── IntegrationSpec.scala

10 directories, 14 files

■ ソースを編集する
疎通確認としては必須ではないけど、一応 Hello Worldってことで、文言だけ変えておく。
package controllers

import play.api._
import play.api.mvc._

object Application extends Controller {

  def index = Action {
    Ok(views.html.index("Hello, world!"))
  }

}

■ Procfile を書く。

heroku 上で実行されるコマンドを記述するやつで、プロジェクトのルート直下に置いとくファイルだけど、これが Play のバージョンごとに違っていて、知らないとちょっと苦労する。2.2.x では、以下のような感じ。
web: target/universal/stage/bin/helloworld -Dhttp.port=${PORT}
"web:" の後が、"play run" だとか "target/start "になってると、古い方式なので、ちゃんと起動しない。あと、port の指定の後に、$JAVA_OPTS とか $PLAY_OPTSとか指定しているチュートリアルもあるけど、これも今のプロダクトだと動かなくなる。

■ git に入れる
$ git init
$ git add .
$ git commit -m "init"

■ heroku アプリを作る
$ heroku create
ここで、ブラウザから heroku にログインすると、Apps ページに今作ったアプリケーションが表示されているのが確認できる。

■ デプロイする
$ git push heroku master

■ 確認する
$ heroku ps
=== web (1X): `target/universal/stage/bin/helloworld -Dhttp.port=${PORT}`
web.1: up 2014/04/21 16:24:01 (~ 18s ago)
何か失敗してたら、up じゃなくて crashed とかになってる。

以下のコマンドで、ブラウザ上、Hello, world!って表示されるのを確認できる。
$ heroku open 

ログを見るには、heroku logs

Procfile が間違ってると、例えば、"web: play run"とか古い Playの設定の仕方だと、"bash: play: command not found"みたいな感じで、ログに吐かれている。

あと $JAVA_OPTS とか余計な指定が入ってると、"Bad application path: -Xmx384m"って書き出される。依存ライブラリの問題なんかもログに出力される。

0 件のコメント:

コメントを投稿