我有一个非常标准的 2.0.3 Grails 应用程序,我已经执行grails install-templates
了将文件 list.gsp、edit.gsp 等放置在 src/templates/scaffolding/ 目录中的操作。对这些文件进行更改时,它们不会自动重新加载。有没有办法让这些自动重新加载,这样我就不必每次进行更改时都停止/启动应用程序?我试过查看watchedResources,但这似乎与插件开发有关。
3 回答
您是正确的,“监视资源”机制仅适用于插件。对此的正确解决方法是修改核心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 上测试的,我最初尝试使用影响但它没有任何效果,但是onChange
在脚手架插件中强制事件具有所需的结果。)
此代码刷新脚手架缓存。您可以为其创建特定的管理操作:
org.codehaus.groovy.grails.scaffolding.view.
ScaffoldingViewResolver.scaffoldedViews.clear()
根据GRAILS-755,这已得到修复,但我认为没有,因为它们也不会为我重新加载。
从那个 Jira,这里有一个可能的解决方法:
使用控制台插件,并运行以下命令来清除动态脚手架视图缓存:
def scaffoldedView = org.codehaus.groovy.grails.scaffolding.view.ScaffoldingViewResolver.scaffoldedViews.clear()</p>
之后,下次我请求一个页面时,它在缓存中找不到它,因此回到磁盘重新创建它。