2012-08-08 21 views
5

私はかなり標準的な2.0.3 Grailsアプリを持っていて、grails install-templatesを実行しました。src/templates/scaffolding /ディレクトリにlist.gsp、edit.gspなどのファイルが置かれています。これらのファイルは、変更が加えられたときに自動的にリロードされません。自動的にリロードされるようにする方法はありますか?変更を加えるたびにアプリケーションを停止/開始する必要はありませんか?私はwatchedResourcesを見てみましたが、それはプラグインの開発に関連しているようです。テンプレートファイルを自動的にリロードする

答えて

11

「監視対象リソース」メカニズムは、プラグインにのみ適用されます。このため、正しい修正は

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

を追加するためにコアScaffoldingGrailsPlugin.groovyを変更することであろうと、それはおそらく、その旨をJIRAを提出する価値があります。しばらくして、この振る舞いをスカッフォールディングプラグインに「注入」するための簡単なプラグインを作成することで、それを動作させることができます。 grails create-plugin watch-scaffoldingを行い、その後、プラグインの記述については、以下を使用します。アプリケーションの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' 

(または任意のルートにあなたのアプリケーションのルートからの適切な相対パスであるを追加プラグイン)とあなたの足場テンプレートの変更が自動的に再読み込みを開始するはずです。

(これは、Grailsの2.1でテストされ、私が最初にinfluencesを使用してみましたが、それは何の効果も持っていなかった、しかし、足場プラグインでonChangeイベントを強制的に必要な結果を持っていた。)

+0

これは、.gspファイルには最適ですが、何らかの理由でController.groovyファイルを受け取っていないようです。何かご意見は? –

+0

同じことが分かります.Control.groovyを変更してもonChangeイベントは発生しません。ドキュメントは、 '.groovy'ファイルである' watchedResources'の特別な処理があることを示唆しています: "監視されたリソースがGroovyファイルを指定すると、変更されると自動的にリロードされ、イベントオブジェクトのonChangeクロージャに渡されます"私は 'Controller.groovy'は通常の意味でのGroovyファイルではない(コンパイルとリロードは行われない)ので、イベントを発生させていないと思う。 –

+0

さらに興味深いことに、 'Controller.groovy'を変更したビューテンプレート_afterを変更すると、コントローラを再読み込みさせるべきです(ビューを変更すると完全な再足場が発生します)。しかし、それはしません。この場合、scaffoldされたコントローラは実際には再生成されていますが、再生成されたクラスは古いクラスと同じ名前でGrailsが同じクラスローダでコンパイルしようとしているため、クラスローダは古い 'Class'新しいものではなくオブジェクトです... –

2

GRAILS-755によると、この修正されていますが、私のためにリロードしないので、私はそれがないと思います。

のJira、ここで可能な回避策であることから:

DEF scaffoldedView = org.codehaus:

ダイナミック 足場ビューキャッシュをクリアするには、コンソールプラグインを使用して、このコマンドを実行します.groovy.grails.scaffolding.view.ScaffoldingViewResolver.scaffoldedViews.clear()その後

、私はページを要求次回は、それは キャッシュにそれを見つけるため、Dに戻っていませんそれを再作成することはありません。

3

このコードはスキャフォールディングキャッシュをフラッシュします。

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

これは良いクイックフィックスですが、もう少し自動化されたものを探していました。ありがとう! –

関連する問題