2012-08-08 11 views
5

Ho una bella app 2.0.3 Grails e ho eseguito grails install-templates che posiziona file list.gsp, edit.gsp, ecc. Nella directory src/templates/scaffolding /. Questi file non vengono ricaricati automaticamente quando viene apportata una modifica. C'è un modo per ottenere che questi vengano ricaricati automaticamente, quindi non devo interrompere/avviare l'app ogni volta che apporto una modifica? Ho provato a guardare ResourcesRisorse ma sembra essere collegato allo sviluppo di plugin.Ricarica automaticamente i file modello

risposta

11

Si è verificato che il meccanismo delle "risorse osservate" si applica solo ai plug-in. La correzione corretto per questo potrebbe essere quella di modificare il nucleo ScaffoldingGrailsPlugin.groovy aggiungere

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

ed è probabilmente vale la pena di presentare una JIRA in tal senso. Nel frattempo, potresti riuscire a farlo funzionare scrivendo un semplice plugin per "iniettare" questo comportamento nel plug-in dello scaffolding. Non grails create-plugin watch-scaffolding e quindi utilizzare la seguente per il descrittore 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 -> } 
} 

Ora, nel del BuildConfig.groovy dell'applicazione aggiungere

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

(o qualunque sia il percorso relativo appropriata dalla radice della vostra applicazione alla radice del il plugin) e le modifiche del modello di ponteggio dovrebbero iniziare a ricaricarsi automaticamente.

(Questa è testato su Grails 2.1, ho inizialmente provato con influences ma non ha alcun effetto, tuttavia forzando un evento onChange nel plugin ponteggio era il risultato richiesto.)

+0

Questo funziona perfettamente per i file .gsp ma non sembra raccogliere il file Controller.groovy per qualche motivo. qualche idea? –

+0

Vedo la stessa cosa: cambiare 'Controller.groovy' non causa un evento' onChange'. La documentazione suggerisce che esiste una gestione speciale per 'watchedResources' che sono file' .groovy': "Se le risorse guardate specificano un file Groovy, quando viene modificato verrà automaticamente ricaricato e passato alla chiusura onChange nell'oggetto evento" e suppongo che dal momento che 'Controller.groovy' non sia un file Groovy nel senso consueto (non viene compilato e ricaricato) non sta sparando l'evento. –

+0

Ancora più interessante, cambiare un modello di vista _dopo aver cambiato 'Controller.groovy' dovrebbe anche far ricaricare il controller (qualsiasi modifica a una vista attiva un pieno ripiegamento).Ma non è così. In questo caso il mio sospetto è che il controller dello scaffolding sia effettivamente rigenerato, ma poiché la classe rigenerata ha lo stesso nome di quello vecchio e Grails sta tentando di compilarlo nello stesso classloader, il classloader ci restituisce il vecchio 'Class' oggetto piuttosto che uno nuovo ... –

2

Secondo GRAILS-755, questo è stato corretto, ma non credo che lo sia perché non ricaricano neanche per me.

Da quel Jira, ecco un possibile soluzione:

usare il plugin console, ed eseguire questo comando per cancellare la dinamica vista ponteggi della cache:

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

Dopo di che, la prossima volta che richiedono una pagina, non trova nella cache , e va quindi torna al d isk per ricrearlo.

3

Questo codice svuota la cache di scaffolding. È possibile creare un'azione di amministrazione specifica per questo:

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

Questa è una buona soluzione rapida, ma cercavo qualcosa di un po 'più automatico. Grazie! –

Problemi correlati