2012-08-08 14 views
5

Mam dość standardową aplikację 2.0.3 Grails i wykonałem grails install-templates, która umieszcza pliki list.gsp, edit.gsp, itd. W katalogu src/templates/scaffolding /. Pliki te nie są automatycznie ponownie ładowane po wprowadzeniu w nich zmian. Czy jest sposób, w jaki mogę je automatycznie ponownie załadować, więc nie muszę zatrzymywać/uruchamiać aplikacji za każdym razem, gdy dokonuję zmiany? Próbowałem już patrzeć na watchnedResources, ale wydaje się, że jest to związane z rozwojem wtyczki.Automatycznie przeładuj pliki szablonów

Odpowiedz

11

Masz rację, że mechanizm "obserwowanych zasobów" dotyczy tylko wtyczek. Prawidłowe ustalenie dla tego byłoby zmodyfikować rdzeń ScaffoldingGrailsPlugin.groovy dodać

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

i to chyba warto złożenie JIRA w tym celu. W międzyczasie możesz być w stanie uruchomić go, pisząc własną wtyczkę, aby "wstrzyknąć" to zachowanie do wtyczki rusztowania. Czy grails create-plugin watch-scaffolding a następnie kliknąć na poniższy dla deskryptora wtyczki:

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 -> } 
} 

Teraz w danej aplikacji BuildConfig.groovy dodać

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

(lub cokolwiek jest odpowiednia względna ścieżka z korzenia swojej aplikacji do korzeni wtyczka) i zmiany w szablonie rusztowania powinny zacząć się automatycznie ładować.

(To jest testowany na Grails 2.1, początkowo próbował za pomocą influences ale to nie ma żadnego wpływu, jednak zmuszając zdarzenie w wtyczce rusztowania onChange był wymagany rezultat.)

+0

Działa to doskonale w przypadku plików .gsp, ale z jakiegoś powodu nie odbiera pliku Controller.groovy. jakieś pomysły? –

+0

Widzę to samo - zmiana 'Controller.groovy' nie powoduje zdarzenia' onChange'. Dokumentacja sugeruje, że istnieje specjalna obsługa dla 'watchedResources', które są plikami' .groovy': Jeśli obserwowane zasoby określają plik Groovy, po jego zmianie zostanie automatycznie przeładowany i przekazany do zamknięcia onChange w obiekcie zdarzenia " i myślę, że skoro 'Controller.groovy' nie jest plikiem Groovy w zwykłym znaczeniu (nie jest kompilowany i przeładowywany), to nie uruchamia zdarzenia. –

+0

Co ciekawsze, zmiana szablonu widoku _ po zmianie 'Controller.groovy' powinna również spowodować przeładowanie kontrolera (każda zmiana w widoku powoduje pełne ponowne rusztowanie).Ale tak nie jest. W tym przypadku podejrzewam, że kontroler szkieletowy jest w rzeczywistości zregenerowany, ale ponieważ zregenerowana klasa ma taką samą nazwę jak stara, a Grails próbuje skompilować ją w tym samym programie ładującym klasy, program ładujący klasy daje nam z powrotem starą "klasę". obiekt zamiast nowego ... –

2

Według GRAILS-755, tym zostało naprawione, ale nie sądzę, że ma, ponieważ nie przeładowuje się dla mnie.

Od tego Jira, tutaj jest możliwe obejście:

Użyj wtyczki konsoli i uruchomić to polecenie, aby wyczyścić pamięć podręczną scaffolded dynamicznego wyświetlania:

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

Po tym, gdy następnym razem mogę zażądać stronę, nie znajdzie go w pamięci podręcznej , a więc sięga d isk, aby go odtworzyć.

3

Ten kod powoduje opróżnienie pamięci podręcznej rusztowania. Można utworzyć dla niego konkretną akcję administratora:

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

To jest dobra szybka naprawa, ale szukałem czegoś bardziej automatycznego. Dzięki! –

Powiązane problemy