ScalaでPlayのプロジェクト作ってHerokuで動かす

※Scala/Play歴は数日なので色々間違ってると思います。気づいた点があったら教えてください


作ったファイル
https://github.com/saito400/play-scala-demo

# 参考にしたページ

https://www.playframework.com/documentation/ja/2.3.x/Home

http://slick.typesafe.com/doc/2.1.0/gettingstarted.html#adding-slick-to-your-project

http://codezine.jp/article/detail/7816

http://qiita.com/kukita/items/6326f1439abec013a479#3-13

http://tototoshi.hatenablog.com/entry/2014/10/09/205728

https://github.com/slick/slick-codegen-example

https://github.com/playframework/play-slick/tree/master/samples

http://www.atmarkit.co.jp/ait/articles/1401/22/news019_3.html

https://www.playframework.com/documentation/ja/2.3.x/ProductionHeroku


http://slick.typesafe.com/doc/2.1.0/code-generation.html

http://qiita.com/tsumekoara/items/f17b8f9b9cc7a1e59ab4?utm_content=buffercdbd7&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer#procfile

https://github.com/bizreach/play2-hands-on

# 環境
|アプリ|バージョン|
|:-----------|:------------:|
|Mac OSX|Yosemite|
|Typesafe Activator|1.2.12|
|Play|2.3.7|
|Slick|2.1.0|


# 準備

## Herokuのアカウント作成

以下からサインアップする。

https://www.heroku.com/

## Heroku Toolbeltのインストール 

以下からダウンロードしインストールする。

https://toolbelt.heroku.com/

## Typesafe Activator をダウンロード

以下からダウンロードする。

http://typesafe.com/community/core-tools/activator-and-sbt

パスを通す

```
export PATH=$PATH:/relativePath/to/activator
```


# 実装


## playのプロジェクトを作成

```
$ activator new play-scala-demo play-scala

$ cd play-scala-demo
```

activatorを起動

```

$ activator

```

eclipseを使う場合はeclipseプロジェクトとして取り込めるよう変換

```
[play-scala-demo] $ eclipse

```

IDEAを使う場合

※以下は不要か？
```
[play-scala-demo] $ idea

```

起動できるかテスト


```
[play-scala-demo] $ start
```

http://localhost:9000/

上記にアクセスし成功してれば「Your new application is ready.」と表示される


## 必要なライブラリの読み込み

build.sbtを修正し、必要なライブラリを追加する。
今回作成したbuild.sbtの内容は以下

```
name := """play-scala-demo"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.11.1"

libraryDependencies ++= Seq(
  jdbc,
  cache,
  ws,
  "com.typesafe.slick" %% "slick" % "2.1.0",
  "com.typesafe.slick" %% "slick-codegen" % "2.1.0",
  "com.typesafe.play" %% "play-slick" % "0.8.0",
  "org.slf4j" % "slf4j-nop" % "1.6.4",
  "org.postgresql"  %  "postgresql"  %  "9.3-1102-jdbc41"
)
```


※anormは削除した。


build.sbt修正後以下のコマンドでライブラリをロードする

```
$ activator update 
```

eclipseを使う場合はeclipseプロジェクトとして取り込めるよう変換

```
$ activator eclipse

```


## ローカルmacにpostgresqlをインストール&テーブル作成
```
$ brew install postgresql

$ postgres -D /usr/local/var/postgres &

$ psql postgres;

postgres=# CREATE DATABASE playdb;

postgres=# ¥q

```

## application.conf設定

conf/application.confに以下を追加



```

db.default.driver=org.postgresql.Driver
db.default.url="jdbc:postgresql://localhost/playdb"


slick.default="models.*"

```


## Slick用のコードを自動生成
Slick用のコードをテーブルからGenerateする為、以下のファイルを作って実行する
※今回はapp/models以下に出力されるよう設定した

```

package tools



import scala.slick.codegen.SourceCodeGenerator

object Generator {

  def main(args: Array[String]): Unit = {

    println("start")

    val slickDriver = "scala.slick.driver.PostgresDriver"
    val jdbcDriver = "org.postgresql.Driver"
    val url = "jdbc:postgresql://localhost/playdb"
    val outputFolder = "app/"
    val pkg = "models"

    SourceCodeGenerator.main(
      Array(
        slickDriver,
        jdbcDriver,
        url,
        outputFolder,
        pkg))

    println("end")
        
  }
}


```






conf/application.confに以下の記述を追加する

```
db.default.driver=org.postgresql.Driver
db.default.url="jdbc:postgresql://localhost/playdb"
slick.default="models.*"
applyEvolutions.default=true
```



Procfileを作成し、以下の内容を記載。
※play-scala-demoをアプリケーション名に変更する

```
web: target/universal/stage/bin/play-scala-demo -Dhttp.port=${PORT} -DapplyEvolutions.default=true -Ddb.default.driver=org.postgresql.Driver -Ddb.default.url=${DATABASE_URL}
```

Evolutions(Railsのマイグレーションみたいなもの？)用のファイルを作成。

-DapplyEvolutions.default=true に設定してこのファイルを作成するとactivator start時に自動でSQLを実行してテーブルを作成してくれる。

conf/evolutions/default/1.sql

```
CREATE TABLE feeds (
    id     serial,
    name    varchar(100),
    url    varchar(500)

); 

```


## コントローラとviewを修正

色々修正しているので以下を参照ください。

https://github.com/saito400/play-scala-demo

基本的には以下のソースを修正すれば良いと思います。
/app/controllers/以下
/app/views/以下
/conf/routes

## ローカルで動作確認

以下のコマンドを実行するとサーバが起動する。

$ activator run

http://localhost:9000/にアクセスし問題ないことを確認

## Heroku側のDB設定

```
$ heroku addons:add heroku-postgresql --app app_name
```

確認

```
$ heroku addons

$ heroku config

```

## Herokuにデプロイ

```
$ git init 

$ git remote add origin YOUR_REPOSITORY

$ git add . -A && git commit -m "initial"

$ git push --set-upstream origin master

$ heroku login

$ heroku create

$ git push heroku master

$ heroku open

```

ブラウザが立ち上がるので、正常に動作してるか確認。

エラーが出てたら$ heroku logsでログを確認する