2012-08-08 76 views
5

我有一个非常标准的2.0.3 Grails应用程序,我执行了grails install-templates,它将文件list.gsp,edit.gsp等放置在src/templates/scaffolding /目录中。这些文件在进行更改时不会自动重新加载。有没有一种方法可以让这些自动重新加载,所以我不必每次停止/启动应用程序时都会进行更改?我试着看watchedResources,但似乎是插件开发相关。自动重新加载模板文件

回答

11

你是正确的“监视资源”机制只适用于插件。这样做的正确的解决将是修改核心ScaffoldingGrailsPlugin.groovy添加

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

,它可能是值得提交JIRA该效果。与此同时,您可以通过编写一个简单的插件来将其“注入”脚手架插件,从而实现它的工作。不要grails create-plugin watch-scaffolding,然后使用该插件描述如下:

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

现在,在您的应用程序的BuildConfig.groovy添加

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

(或者是你的应用程序的根,以根适当的相对路径插件),脚手架模板更改应自动重新加载。

(这是在Grails的2.1测试,我使用influences最初尝试,但它并没有任何作用,但是迫使脚手架插件的onChange事件引发了所需的结果。)

+0

这对于.gsp文件很好用,但由于某种原因似乎没有拿起Controller.groovy文件。有什么想法吗? – 2012-08-15 18:33:39

+0

我看到同样的事情 - 更改'Controller.groovy'不会导致'onChange'事件。这个文档建议''watchedResources'对'.groovy'文件进行特殊处理:“如果被监视的资源指定了一个Groovy文件,那么当它被改变时,它会自动重新加载并传递到事件对象的onChange闭包中。 ,我想'因为'Controller.groovy'不是通常意义上的Groovy文件(它不会被编译和重载),它不会触发事件。 – 2012-08-15 23:38:47

+0

更有趣的是,在改变'Controller.groovy'后更改视图模板应该会导致控制器也被重新加载(任何对视图的更改都会触发完整的重新脚手架)。但事实并非如此。在这种情况下,我怀疑脚手架控制器实际上是在重新生成,但由于重新生成的类与旧的名称相同,而Grails试图在同一个类加载器中编译它,所以类加载器将旧的'Class'对象而不是一个新的... – 2012-08-15 23:42:36

2

根据GRAILS-755,这已经修复,但我不认为它有,因为他们也不会为我加载。

从那个吉拉,这里是一个可能的解决方法:

使用控制台插件,并运行此命令清除动态 脚手架视图缓存:

高清scaffoldedView = org.codehaus .groovy.grails.scaffolding.view.ScaffoldingViewResolver.scaffoldingViews.clear()

之后,下一次我请求一个页面时,它在 缓存中找不到它,因此回到d要重新创建它。

3

此代码刷新脚手架缓存。你可以为它创建一个特定的管理操作:

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

这是一个很好的快速修复,但我正在寻找一些更自动的东西。谢谢! – 2012-08-15 18:34:31