2012-08-08 16 views
5

मेरे पास एक सुंदर मानक 2.0.3 Grails ऐप है और मैंने grails install-templates निष्पादित किया है जो src/templates/scaffolding/निर्देशिका में files list.gsp, edit.gsp, आदि फ़ाइलों को स्थानांतरित करता है। जब इन्हें कोई परिवर्तन किया जाता है तो ये फ़ाइलें स्वचालित रूप से पुनः लोड नहीं होती हैं। क्या कोई तरीका है कि मैं इसे स्वचालित रूप से पुनः लोड करने के लिए प्राप्त कर सकता हूं, इसलिए जब भी मैं कोई परिवर्तन करता हूं तो मुझे ऐप को रोकना/शुरू करना नहीं पड़ता है? मैंने देखा स्रोतों को देखने की कोशिश की है लेकिन ऐसा लगता है कि प्लगइन विकास संबंधित है।स्वचालित रूप से टेम्पलेट फ़ाइलों को दोबारा लोड करें

उत्तर

11

आप सही हैं कि "देखे गए संसाधन" तंत्र केवल प्लगइन पर लागू होते हैं। इस के लिए सही ठीक

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

जोड़ने के लिए कोर ScaffoldingGrailsPlugin.groovy संशोधित करने के लिए हो सकता है और यह शायद उस प्रभाव के लिए एक JIRA प्रस्तुत करने के लायक है। इस बीच, आप इस व्यवहार को मचान प्लगइन में "इंजेक्ट" करने के लिए स्वयं की एक साधारण प्लगइन लिखकर काम कर सकते हैं। अपने आवेदन की BuildConfig.groovy जोड़ने

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 -> } 
} 
अब में

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

(या जो कुछ भी की जड़ के लिए अपने app की जड़ से उचित रिश्तेदार पथ है: grails create-plugin watch-scaffolding करें और फिर प्लगइन वर्णनकर्ता के लिए निम्नलिखित का उपयोग करें प्लगइन) और आपके मचान टेम्पलेट परिवर्तन स्वचालित रूप से पुनः लोड करना शुरू कर देना चाहिए।

(यह पर Grails 2.1 परीक्षण किया जाता है, मैं शुरू में influences उपयोग करने की कोशिश, लेकिन यह कोई प्रभाव नहीं था, हालांकि मचान प्लगइन में एक onChange घटना के लिए मजबूर कर परिणाम की आवश्यकता थी।)

+0

यह .gsp फ़ाइलों के लिए बहुत अच्छा काम करता है लेकिन किसी कारण से Controller.groovy फ़ाइल को नहीं लगता है। कोई विचार? –

+0

मुझे एक ही चीज़ दिखाई देती है - 'Controller.groovy' को बदलने से' ऑन चेंज 'ईवेंट नहीं होता है। दस्तावेज़ीकरण से पता चलता है कि 'देखे गए स्रोतों 'के लिए विशेष हैंडलिंग है जो' ग्रोवी 'फाइलें हैं:" यदि देखे गए संसाधन एक ग्रोवी फ़ाइल निर्दिष्ट करते हैं, जब इसे बदला जाता है तो इसे स्वचालित रूप से पुनः लोड किया जाएगा और ईवेंट ऑब्जेक्ट में चेंज क्लोजर में पारित किया जाएगा " , और मुझे लगता है कि चूंकि 'Controller.groovy' सामान्य ज्ञान में ग्रोवी फ़ाइल नहीं है (यह संकलित और पुनः लोड नहीं होता है) यह घटना को फायर नहीं कर रहा है। –

+0

अधिक दिलचस्प बात यह है कि, एक कंटेंट टेम्पलेट बदलना _after_ बदलकर 'Controller.groovy' को कंट्रोलर को फिर से लोड किया जाना चाहिए (किसी भी दृश्य में कोई भी बदलाव एक पूर्ण पुनः-मचान ट्रिगर करता है)।लेकिन ऐसा नहीं है। इस मामले में मेरा संदेह यह है कि मचान नियंत्रक _is_ वास्तव में पुनर्जीवित हो रहा है, लेकिन पुनर्जन्मित वर्ग का पुराना नाम समान नाम है और Grails उसी क्लासलोडर में संकलित करने का प्रयास कर रहा है, क्लासलोडर हमें पुरानी 'कक्षा' एक नए के बजाय वस्तु ... –

2

GRAILS-755, इस के अनुसार तय किया गया है, लेकिन मुझे नहीं लगता कि यह इसलिए है क्योंकि वे मेरे लिए भी पुनः लोड नहीं करते हैं।

से Jira, यहाँ एक संभावित समाधान है कि:

सांत्वना प्लगइन का उपयोग करें, और गतिशील scaffolded दृश्य कैश को साफ़ करने के लिए इस कमांड चलाएँ:

डीईएफ़ scaffoldedView = org.codehaus .groovy.grails.scaffolding.view.ScaffoldingViewResolver.scaffoldedViews.clear()

उसके बाद, अगली बार मैं एक पृष्ठ का अनुरोध, यह इसके कैश में नहीं मिल रहा है, और इस तरह घ वापस चला जाता है इसे फिर से बनाने के लिए isk।

3

यह कोड मचान कैश flushes। आप इसके लिए एक विशिष्ट व्यवस्थापक कार्रवाई बना सकते हैं:

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

यह एक अच्छा त्वरित तय है, लेकिन मैं कुछ और अधिक स्वचालित की तलाश में था। धन्यवाद! –

संबंधित मुद्दे