/ / ¿Por qué un cambio en la carpeta pública desencadena la recarga automática? - java, playframework-2.0, sbt

¿Por qué un cambio en la carpeta pública desencadena la recarga automática? - java, playframework-2.0, sbt

Actualmente estoy desarrollando una aplicación web con Play Framework 2.3.0 y AngularJS. Uso el /public Carpeta de Play Framework para servir mi aplicación AngularJS.

Cada cambio que hago durante el desarrollo provoca una recarga completa por parte de Play, lo cual es un poco molesto ya que tengo un tiempo costoso de computación en el Global.beforeStart método.

¿Por qué dispara una recarga automática ya que, como La documentación de Play 2.3.0. dice:

Recursos almacenados en el public Directorio son activos estáticos que son Servido directamente por el servidor web.

Cualquier idea sobre cómo deshabilitar la función de recarga automática para el public carpeta?

EDITAR: Otro pensamiento: ¿hay una manera de servir los recursos de una carpeta externa que no se monitorea utilizando el Assets controlador ?

Respuestas

0 para la respuesta № 1

Agregué lo siguiente a mi build.sbt:

    watchSources := (watchSources.value
--- baseDirectory.value / "public"     ** "*").get

Se eliminará "/ public" de la lista de carpetas que se están viendo. Tenga en cuenta que esto podría romper cosas, pero es una buena solución hasta que se solucione el problema.


3 para la respuesta № 2

Las recargas son no desencadenado por fuente cambios de archivo, son activados por ruta de clase cambios Por supuesto, un cambio de archivo de origen puede desencadenar un cambio de ruta de clase, pero también puede que no.

El modo de ejecución del modo de juego es que vigila a todos.cambios en el archivo de origen, esto incluye cambios en el directorio público y también en los activos, ya que es posible que deba procesarse en estos. Siempre que hay un cambio, le pide a sbt que compile, esto significa que recompilará todo, incluidos los activos estáticos y los archivos scala / java.

Cuando sbt recompila usa incrementalcompilación: eso significa que almacena el resultado de la última compilación y lo examina para determinar si hay algún trabajo nuevo que deba realizarse desde la última compilación. Si no hay, entonces salta la compilación.

Lo mismo se hace para copiar recursos del directorio de recursos a la ruta de clase.

Entonces, después de que Play haya pedido a sbt que lo compile,luego cheques - ¿hubo algún cambio en el classpath? Si los hubiera, se recarga. Pero, si todo lo que cambió fue un archivo javascript, entonces no debería haberlo hecho.

Sin embargo, no eres la única persona que cambiaarchivos: si ha configurado SBT para generar algunos archivos para usted, tal vez un archivo fuente de Java / Scala, o tal vez solo algún recurso en el directorio conf, y la tarea que ha escrito lo hace cada vez, ya sea que tenga que hacerlo o no - bueno, esto puede ser un cambio de classpath.

Por lo tanto, para resolver su problema, verifique cualquier tarea quehas escrito, o cualquier complemento que estés usando, para ver si están generando fuentes o recursos. Si lo son, y no están siendo inteligentes al respecto, es decir, están "regenerando los mismos archivos cuando no lo necesitan, entonces es probable que Play se vuelva a cargar en cualquier archivo de origen, ya que significa que cada El tiempo se vuelve a compilar, el archivo se regenera, lo que cambia la ruta de clase.


0 para la respuesta № 3

Tal vez usted está (o estaba) utilizando el BuildInfoPlugin? (o tal vez otras personas que encuentren esta pregunta, úsela)

Play Framework siempre se reiniciaba para mí, cada vez que tocaba algo en public/. Finalmente, noté que esto se debía a que estoy usando SBT BuildInfoPlugin, https://github.com/sbt/sbt-buildinfo, y lo había configurado para incluir marcas de tiempo de compilación, y también git status, en la información de construcción generada. Después de que eliminé esas partes de la información de compilación, Play ya no vuelve a compilar ni a recargarse después de los cambios en public/.

Esto fue con SBT 0.13.15 y SBT 1.1.1, y Play Framework 2.6.9 y 2.6.12.

Esto es lo que quité:
buildInfoOptions += BuildInfoOption.BuildTime
y:
BuildInfoKey.action("gitStatus") { "git status".!!.trim }).

(No necesito configurar watchSources o playMonitoredFiles para que Play deje de volver a recopilar y recargar.)