2013-09-23 10 views
23

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.

risposta

14

se

play (entering shell) 
project web 
run 

opere, allora si può fare il lavoro da linea di comando:

play "project web" "run" 

Si può fare a riga di comando qualunque cosa che si può fare nella shell.

Ho la stessa struttura del progetto ed è il modo per farlo che funziona bene per me.

A proposito, non penso che la roba di ricarica sia correlata a Play. È una compilazione incrementale fornita da SBT che viene utilizzata da Play. Il comando play è solo un launcher SBT hackerato credo.

Il seguente comando funziona bene per me:

sbt "project web" "run" 

E comincia il progetto Play with reload caldo.


Penso che si può anche utilizzare

sbt "project web" "~run" 

che cercherà di ricompilare ogni volta che si modifica un file di origine, invece di aspettare un aggiornamento del browser, e farà vincere un po 'di tempo.

0

Penso che questo sia un bug in Play 2.2, quindi l'ho segnalato come Error "/:playRunHooks is undefined" on running as web/run. Anche sembra essere stato risolto in 2.3.x, quindi probabilmente non verrà corretto per 2.2. Ecco una soluzione un po 'nerd che mi è venuta in mente:

lazy val root = (project in file(".")). 
    settings(
    playRunHooks := Nil, 
    playInteractionMode := play.PlayConsoleInteractionMode, 
    playDefaultPort := 9000, 
    playMonitoredFiles := (Def.taskDyn { 
     val s = state.value 
     s.history.current.split("/").headOption match { 
     case Some(ref) => 
      Def.task { 
      (playMonitoredFiles in LocalProject(ref)).value 
      } 
     case _ => 
      Def.task { 
      playMonitoredFiles.value 
      } 
     } 
    }).value 
) 
Problemi correlati