Sto provando a creare un'applicazione Scala costituita da un progetto di libreria (chiamiamolo questo common
), un progetto server di risparmio (chiamiamolo questo server
) e un gioco progetto di applicazione web (di seguito denominato web
). Tutti e tre sono scritti in Scala e costruiti con sbt.Come creare un'applicazione Play 2.2 Scala come sottoprogetto SBT
mia struttura del progetto si presenta così:
myproject/
-common/
...
-server/
...
-web/
-app/
-conf/
...
-project/
-Build.scala
-build.properties
-build.sbt
mio build.sbt
di file (semplificato un po ') si presenta così:
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)
Il problema di questo è che il progetto principale non è un gioco progetto, quindi il comando play
non funziona (errori con
java.lang.RuntimeException: */*:playRunHooks is undefined.
at scala.sys.package$.error(package.scala:27)
Posso risolvere il problema rendendo il progetto root simile a un progetto Play se inserisco la riga playScalaSettings
dopo la riga version
nel file SBT, ma poi ho un altro problema: il comando play run
tenta di eseguire il progetto root, non lo web
sottoprogetto. Ovviamente il comando play run
non funziona quando viene eseguito nella sottodirectory web
poiché non vi è alcun file SBT lì per descrivere il progetto e le sue dipendenze.
Sto cercando una soluzione che mi permetta di mantenere questa struttura del progetto (cioè il progetto Play è uno dei tanti sotto-progetti nella mia applicazione), pur mantenendo tutta la caldazza del Play framework come aggiornamenti a caldo quando il codice cambia (anche codice in librerie dipendenti come common
).
ho pensato che ho trovato la soluzione eseguendo play
per ottenere la console interattiva, e quindi
project web
run
Che funziona, ma non funziona sulla riga di comando. play web/run
per qualche motivo esegue il comando di livello root run
, che come indicato sopra non funziona perché l'applicazione di root non è un'applicazione di riproduzione.
Nota: una domanda simile è stata posta prima nel contesto di Play 2.0 allo Play Framework as SBT Non-Root Module, ma la risposta non è soddisfacente, né credo che sia ancora corretta a partire da Play 2.2.