記事「Play2.1でsbtのマルチプロジェクトビルド機能を利用してレイヤードアーキテクチャを強制する方法を」参考に, play2.3でのBuild.scalaの記述をマイグレーションガイドを見ながら試してみました.
GitHub:53ningen/LayeredArchitectureInPlay2.3
今回ためしてみたこと
以下のようなディレクトリ構造を持たせ,application/domain/infrastructureという3層のレイヤー構造でアプリケーションを構築します. このときapplicationからはdomainとinfrastructure, domainからはinfrastructureしか参照出来ないようにプロジェクトの設定をします. 当然infrastructureから上位層にはアクセスできず,IDEの補完もでない状態になります.
build.sbt
以下のように書けばおk. 一旦ビルドするとmodules以下のlayeredApplication, layeredDomain, layeredInfrastructureが勝手に生成されビルドが失敗するので, 出来た各サブモジュールのなかにまたbuild.sbtを作る.
import play.PlayScala
name := """Layered"""
version := "1.0-SNAPSHOT"
lazy val root = (project in file(".")).enablePlugins(PlayScala)
.aggregate(layeredApplication, layeredDomain, layeredInfrastructure)
.dependsOn(layeredApplication, layeredDomain, layeredInfrastructure)
lazy val layeredApplication = (project in file("modules/layered-application"))
.enablePlugins(PlayScala)
.dependsOn(layeredDomain, layeredInfrastructure)
lazy val layeredDomain = (project in file("modules/layered-domain"))
.enablePlugins(PlayScala)
.dependsOn(layeredInfrastructure)
lazy val layeredInfrastructure = (project in file("modules/layered-infrastructure"))
.enablePlugins(PlayScala)
scalaVersion := "2.11.1"
libraryDependencies ++= Seq(
jdbc,
anorm,
cache,
ws
)