自动重新加载模板文件

5
我有一个标准的2.0.3 Grails应用程序,并且我执行了grails install-templates命令,它会将文件list.gsp、edit.gsp等放置在src/templates/scaffolding/目录中。当对这些文件进行更改时,它们不会自动重新加载。有没有办法让它们自动重新加载,这样我就不必每次更改时都停止/启动应用程序了?我尝试查看watchedResources,但那似乎与插件开发相关。
3个回答

11

您是正确的,"watched-resources"机制只适用于插件。正确的修复方法是修改核心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事件可以达到所需的结果。)


这对于 .gsp 文件非常有效,但出于某些原因似乎无法捕获 Controller.groovy 文件。有什么想法吗? - Jarred Olson
我看到了同样的事情 - 改变 Controller.groovy 不会引起 onChange 事件。文档建议对于 .groovy 文件有特殊处理的 watchedResources :“如果被监视的资源指定为 Groovy 文件,则在更改时它将自动重新加载并传递到事件对象中的 onChange 闭包中”,我猜想由于 Controller.groovy 不是通常意义上的 Groovy 文件(它不会被编译和重新加载),因此它不会触发事件。 - Ian Roberts
更有趣的是,在修改了 Controller.groovy 之后再更改视图模板应该也会导致控制器重新加载(对视图的任何更改都会触发完整的重新生成)。但实际上并没有。在这种情况下,我怀疑生成的脚手架控制器确实已经被重新生成了,但由于重新生成的类与旧类具有相同的名称,并且 Grails 正在尝试在同一类加载器中编译它,因此类加载器会将旧的 Class 对象返回给我们,而不是一个新的对象... - Ian Roberts

3

这段代码清除了脚手架缓存。您可以为此创建一个特定的管理操作:

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

这是一个不错的快速解决方案,但我正在寻找更自动化的东西。谢谢! - Jarred Olson

2
根据GRAILS-755,这个问题已经被修复了,但我认为它没有被修复,因为对我来说它们也没有重新加载。
从那个 Jira 中,这里提供一个可能的解决方法:

使用控制台插件,并运行此命令以清除动态生成的视图缓存:

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

之后,下一次请求页面时,它不会在缓存中找到它,因此回到磁盘重新创建它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接