heroku(scala編)

sbtインストール(cygwin上)

https://github.com/harrah/xsbt/wiki/Getting-Started-Setup
から
sbt-launch.jar
をダウンロードする。

sbt-launch.jar
を保存したディレクトリに
shellスクリプトsbtを作成して実行権限を付与する。

SBT_DIR=`dirname $0`
java -Xmx512M -jar `cygpath -m $SBT_DIR`/sbt-launch.jar "$@"

UNIX用の起動スクリプトcygwin向けにアレンジ。

sbt起動スクリプトにPATHを通す。
.bash_profile

export PATH="/cygdrive/C/{sbt置き場}:$PATH"

以降の手順

http://devcenter.heroku.com/articles/scala
ベース

heroku login

$ heroku login
Enter your Heroku credentials.
Email: ousttrue@gmail.com
Password:

プロジェクト

$ mkdir sbthello
$ cd sbthello
$ mkdir -p src/main/scala

src/main/scala/Web.scala

import org.jboss.netty.handler.codec.http.{HttpRequest, HttpResponse}
import com.twitter.finagle.builder.ServerBuilder
import com.twitter.finagle.http.{Http, Response}
import com.twitter.finagle.Service
import com.twitter.util.Future
import java.net.InetSocketAddress
import util.Properties

object Web {
  def main(args: Array[String]) {
    val port = Properties.envOrElse("PORT", "8080").toInt
    println("Starting on port:"+port)
    ServerBuilder()
      .codec(Http())
      .name("hello-server")
      .bindTo(new InetSocketAddress(port))
      .build(new Hello)
    println("Started.")
  }
}

class Hello extends Service[HttpRequest, HttpResponse] {
  def apply(req: HttpRequest): Future[HttpResponse] = {
    val response = Response()
    response.setStatusCode(200)
    response.setContentString("Hello World")
    Future(response)
  }
}
$ mkdir project
$ echo sbt.version=0.11.0 > project/build.properties

build.sbt

import com.typesafe.startscript.StartScriptPlugin

seq(StartScriptPlugin.startScriptForClassesSettings: _*)

name := "hello"

version := "1.0"

scalaVersion := "2.8.1"

resolvers += "twitter-repo" at "http://maven.twttr.com"

libraryDependencies ++= Seq("com.twitter" % "finagle-core" % "1.9.0", "com.twitter" % "finagle-http" % "1.9.0")

project/build.sbt

resolvers += Classpaths.typesafeResolver

addSbtPlugin("com.typesafe.startscript" % "xsbt-start-script-plugin" % "0.3.0")

ビルド

$ sbt clean compile stage

foreman

Procfile

web: target/start Web
$ foreman start

target/startがWindows的に都合悪い
\を/に、:C:を;C:に置換すれば動いた。

gitに登録

.gitignore

target
project/boot
project/target
project/plugins/target
$ git add .
$ git commit -m "init"
[master (root-commit) 8ebe005] init
 6 files changed, 51 insertions(+), 0 deletions(-)
 create mode 100644 .gitignore
 create mode 100644 Procfile
 create mode 100644 build.sbt
 create mode 100644 project/build.properties
 create mode 100644 project/build.sbt
 create mode 100644 src/main/scala/Web.scala

herokuアプリを作る

$ heroku create --stack cedar

herokuにアップする

$ git push heroku master

ブラウザで開く

$ heroku open

以上で、heroku scala+sbt編終わり。