tutorial starter play instalar framework español application playframework sbt

playframework - starter - play framework tutorial español



Cómo crear una aplicación Play 2.2 Scala como un subproyecto SBT (2)

Estoy tratando de crear una aplicación Scala que consiste en un proyecto de biblioteca (llamémoslo common ), un proyecto de servidor Thrift (llamemos a este server ) y un proyecto de aplicación web Play (en lo sucesivo, web ). Los tres están escritos en Scala y construidos con sbt.

La estructura de mi proyecto se ve así:

myproject/ -common/ ... -server/ ... -web/ -app/ -conf/ ... -project/ -Build.scala -build.properties -build.sbt

Mi archivo build.sbt (un poco simplificado) se ve así:

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)

El problema con esto es que el proyecto raíz no es un proyecto Play, por lo que el comando play no funciona (se produce un error con

java.lang.RuntimeException: */*:playRunHooks is undefined. at scala.sys.package$.error(package.scala:27)

Puedo solucionar esto haciendo que el proyecto raíz se vea como un proyecto Play si inserto la línea playScalaSettings después de la línea de la version en el archivo SBT, pero luego tengo otro problema: el comando play run intenta ejecutar el proyecto raíz, no la web subproyecto Obviamente, el comando play run no funciona cuando se ejecuta en el subdirectorio web ya que no hay ningún archivo SBT que describa el proyecto y sus dependencias.

Estoy buscando una solución que me permita conservar esta estructura del proyecto (lo que significa que el proyecto Play es uno de los muchos subproyectos en mi aplicación), a la vez que conservo toda la funcionalidad de Play Framework, como las actualizaciones cuando el código cambia (incluso el código en bibliotecas dependientes como common ).

Pensé que encontré la solución ejecutando play para obtener la consola interactiva, y luego

project web run

Eso funciona, pero no funciona en la línea de comandos. play web/run por alguna razón ejecuta el comando run nivel raíz, que, como se indicó anteriormente, no funciona porque la aplicación root no es una aplicación Play.

Nota: antes se hizo una pregunta similar en el contexto de Play 2.0 en Play Framework como SBT Non-Root Module , pero la respuesta no es satisfactoria, ni creo que siga siendo correcta en Play 2.2.


Creo que este es un error en Play 2.2, así que lo informé como Error " / : playRunHooks no está definido" al ejecutarse como web / run . También parece que se ha corregido en 2.3.x, por lo que probablemente no se arreglará para 2.2. Aquí hay una solución un poco nerd que se me ocurrió:

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 )


Si

play (entering shell) project web run

funciona, entonces puedes hacerlo funcionar desde la línea de comando:

play "project web" "run"

Puedes hacer en la línea de comandos lo que sea que puedas hacer en el shell.

Tengo la misma estructura de proyecto y es la forma de hacerlo que funciona bien para mí.

Por cierto, no creo que las cosas de recarga en caliente estén relacionadas con Play. Es una compilación incremental provista por SBT que es utilizada por Play. El comando de juego es solo un lanzador SBT pirateado, creo.

El siguiente comando funciona bien para mí:

sbt "project web" "run"

Y comienza el proyecto Play con recarga en caliente.

Creo que incluso puedes usar

sbt "project web" "~run"

Lo que intentará recompilar cada vez que cambie un archivo de origen, en lugar de esperar a que se actualice el navegador, y ganará algún tiempo.