2012-08-08 8 views
5

Tengo una aplicación bastante estándar 2.0.3 Grails y he ejecutado grails install-templates que coloca los archivos list.gsp, edit.gsp, etc. en src/templates/scaffolding/directory. Estos archivos no se vuelven a cargar automáticamente cuando se realiza un cambio en ellos. ¿Hay alguna manera de que pueda volver a cargar estos automáticamente para que no tenga que detener/iniciar la aplicación cada vez que realice un cambio? Intenté buscar en watchedResources, pero eso parece estar relacionado con el desarrollo de complementos.Recargar automáticamente archivos de plantilla

Respuesta

11

Tiene razón en que el mecanismo de "recursos mirados" solo se aplica a los complementos. La solución correcta para este sería modificar el núcleo ScaffoldingGrailsPlugin.groovy añadir

def watchedResources = "file:./src/templates/scaffolding/*" 

y es probable que vale la pena enviar un JIRA a tal efecto. Mientras tanto, puede lograr que funcione al escribir un plugin simple para "inyectar" este comportamiento en el plugin de andamios. No grails create-plugin watch-scaffolding y luego usar lo siguiente para el descriptor de plugin:

import org.codehaus.groovy.grails.plugins.GrailsPlugin 

class WatchScaffoldingGrailsPlugin { 
    def version = "0.1" 
    def grailsVersion = "2.0 > *" 
    def dependsOn = [:] 
    def pluginExcludes = [ "grails-app/views/error.gsp" ] 

    def title = "Watch Scaffolding Plugin" 
    def author = "Your name" 
    def authorEmail = "" 
    def description = '''\ 
Watches for changes to scaffolding templates and reloads dynamically-scaffolded 
controllers and views. 
''' 
    // URL to the plugin's documentation 
    def documentation = "http://grails.org/plugin/watch-scaffolding" 

    // watch for changes to scaffolding templates... 
    def watchedResources = "file:./src/templates/scaffolding/*" 

    // ... and kick the scaffolding plugin when they change 
    def onChange = { event -> 
     event.manager.getGrailsPlugin('scaffolding').notifyOfEvent(
      GrailsPlugin.EVENT_ON_CHANGE, null) 
    } 

    // rest of plugin options are no-op 
    def onConfigChange = { event -> } 
    def doWithWebDescriptor = { xml -> } 
    def doWithSpring = { } 
    def doWithDynamicMethods = { ctx -> } 
    def doWithApplicationContext = { applicationContext -> } 
    def onShutdown = { event -> } 
} 

Ahora en la BuildConfig.groovy su aplicación añadir

grails.plugin.location.'watch-scaffolding' = '../watch-scaffolding' 

(o lo que es la ruta relativa apropiada de la raíz de su aplicación a la raíz el complemento) y sus cambios en la plantilla del andamio deberían comenzar a cargarse automáticamente.

(Esto se prueba en Grails 2.1, inicialmente He intentado utilizar influences pero no tiene ningún efecto, sin embargo forzando un evento onChange en el plugin andamios habían el resultado requerido.)

+0

Esto funciona muy bien para archivos .gsp pero no parece recoger el archivo Controller.groovy por alguna razón. ¿Alguna idea? –

+0

Veo lo mismo: cambiar 'Controller.groovy' no causa un evento' onChange'. La documentación sugiere que hay un manejo especial para 'watchedResources' que son archivos' .groovy': "Si los recursos observados especifican un archivo Groovy, cuando se cambie se volverá a cargar automáticamente y se pasará al cierre onChange en el objeto de evento" , y supongo que dado que 'Controller.groovy' no es un archivo Groovy en el sentido habitual (no se compila y vuelve a cargar) no está activando el evento. –

+0

Más interesante aún, cambiar una plantilla de vista _después_ de haber cambiado 'Controller.groovy' debería hacer que el controlador también se vuelva a cargar (cualquier cambio en una vista desencadena un nuevo andamio completo).Pero no es así En este caso mi sospecha es que el controlador scaffolded _es_ de hecho se está regenerando, pero debido a que la clase regenerada tiene el mismo nombre que la anterior y Grails está intentando compilarla en el mismo cargador de clases, el cargador de clases nos devuelve la antigua 'Clase' objeto en lugar de uno nuevo ... –

2

Según GRAILS-755, este ha sido corregido, pero no creo que tenga porque tampoco me lo vuelven a cargar.

A partir de ese Jira, aquí hay una posible solución:

utilizar el plugin de consola y ejecuta este comando para borrar la vista andamiaje de memoria caché dinámica:

def scaffoldedView = org.codehaus .groovy.grails.scaffolding.view.ScaffoldingViewResolver.scaffoldedViews.clear()

Después de eso, la próxima vez que solicita una página, que no lo encuentra en el caché, y por lo tanto se remonta a la d isk para recrearlo.

3

Este código vacía el caché de andamios. Puede crear una acción de administrador específica para él:

org.codehaus.groovy.grails.scaffolding.view. 
    ScaffoldingViewResolver.scaffoldedViews.clear() 
+0

Esta es una buena solución rápida, pero estaba buscando algo un poco más automático. ¡Gracias! –