Como criar um aplicativo do Play Scala 2.2 como um subprojeto do SBT
Eu estou tentando criar um aplicativo Scala que consiste em um projeto de biblioteca (vamos chamar issocommon
), um projeto de servidor Thrift (vamos chamar issoserver
) e um projecto de aplicação web Play (a seguir denominadoweb
). Todos os três são escritos em Scala e construídos com sbt.
Minha estrutura de projeto é assim:
myproject/
-common/
...
-server/
...
-web/
-app/
-conf/
...
-project/
-Build.scala
-build.properties
-build.sbt
Minhasbuild.sbt
arquivo (simplificado um pouco) se parece com isso:
import play.Project._
name := "myproject"
version := "1.0-SNAPSHOT"
lazy val common = project
lazy val web = project
.settings(playScalaSettings: _*)
.dependsOn(common)
lazy val server = project
.dependsOn(common)
lazy val root = project.in(file("."))
.aggregate(common, web, server)
O problema com isso é que o projeto raiz não é um projeto Play, então oplay
comando não funciona (erros com
java.lang.RuntimeException: */*:playRunHooks is undefined.
at scala.sys.package$.error(package.scala:27)
Eu posso consertar isso fazendo com que o projeto raiz pareça um projeto do Google Play se eu inserir a linhaplayScalaSettings
depois deversion
linha no arquivo SBT, mas depois eu tenho outro problema: oplay run
comando tenta executar o projeto raiz, não oweb
subprojeto. Obviamente, oplay run
comando não funciona quando executado noweb
subdiretório, pois não existe arquivo SBT para descrever o projeto e suas dependências.
Eu estou procurando uma solução que me permita manter essa estrutura de projeto (ou seja, o projeto Play é um dos vários subprojetos em meu aplicativo), mantendo todo o hotness do Google Play como hot updates quando o código é alterado (até codificar em bibliotecas dependentes gostarcommon
).
Eu pensei que encontrei a solução executandoplay
para obter o console interativo e, em seguida,
project web
run
Isso funciona, mas não funciona na linha de comando.play web/run
por algum motivo, executa o nível da raizrun
comando, como mencionado acima, não funciona porque o aplicativo raiz não é um aplicativo Play.
Nota: Uma pergunta semelhante foi feita antes no contexto do Play 2.0 emPlay Framework como o módulo não-raiz do SBT, mas a resposta não é satisfatória, nem acredito que ainda esteja correta a partir do Play 2.2.