読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

PlayFramework 2.4 でサブプロジェクトで一部URLを切り出してみる

日記 勉強 Playframework

教科書は下記

SBTSubProjects

で、まずはプロジェクト root ディレクトリに下記を一気に作成

  • modules
    • /rest_apis
      • /controllers
      • /conf

そして、

modules/rest_apis/build.sbt を作成する。

ここに実は二つ罠があった。
公式では下記(20015/7/8 時点)が書かれているのだが

name := "myadmin"

libraryDependencies ++= Seq(
  "mysql" % "mysql-connector-java" % "5.1.35",
  jdbc,
  anorm
)

ここに罠が二つあって、

  1. Play2.4 では anorm が分離したので、書き方が違う
  2. scalaVersion := "2.11.6" などのように、ScalaVersion を親と同じ指定をしないと、ビルドでこける(下記)
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: rest_apis#rest_apis_2.11;0.1-SNAPSHOT: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn] 
[warn]  Note: Unresolved dependencies path:
[warn]          rest_apis:rest_apis_2.11:0.1-SNAPSHOT
[warn]            +- a-albums:a-albums_2.11:1.0-SNAPSHOT
[trace] Stack trace suppressed: run last root/*:update for the full output.
[error] (root/*:update) sbt.ResolveException: unresolved dependency: rest_apis#rest_apis_2.11;0.1-SNAPSHOT: not found
[error] Total time: 5 s, completed 2015/07/08 21:42:26

自分は、とりあえず切り離しが目標だったので、anorm の記述は削除して、ScalaVersion は2.11.6 を指定した。

name := "rest_apis"

scalaVersion := "2.11.6"

libraryDependencies ++= Seq(
  "mysql" % "mysql-connector-java" % "5.1.35",
  jdbc
)

その上で、親プロジェクトの build.sbt を編集。

+ lazy val rest_apis = (project in file("modules/rest_apis")).enablePlugins(PlayScala)
  
  lazy val root = (project in file(".")).enablePlugins(PlayScala)
+   .dependsOn(rest_apis).aggregate(rest_apis)

ここから、サブプロジェクトの中にアプリケーションを配置し始める。

modules/rest_apis/conf/rest_apis.routes ファイルを作成して下記を突っ込む。

GET /                  controllers.rest_apis.Application.index()

対応するコントローラを modules/rest_apis/controllers/Application.scala

package controllers.rest_apis

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

object Application extends Controller {

  def index = Action { implicit request =>
    Ok("{'msg':\"Hello test api\"}").as("application/json")
  }
}

あとは、conf/routes ファイルを編集して

  GET     /                           controllers.Application.index
+ 
+ ->  /api                            rest_apis.Routes

これで準備完了。

sbt clean compile run して http://localhost:9000/api を見て、出ればOK

基本データ、REST API を切り出すとかの用途で使えそう。