2016-04-30 8 views
3

は今のところ私は現在、それほどのような変数にすべてのテンプレートをパース:私は変更を加えた場合アプリの起動後にhtmlテンプレートを再読み込みすることはできますか?

var templates = template.New("Template") 

func LoadTemplates() { 
    filepath.Walk("view/", func(path string, info os.FileInfo, err error) error { 
     if strings.HasSuffix(path, ".html") { 
      templates.ParseFiles(path) 
     } 
     return nil 
    }) 
} 

func Render(w http.ResponseWriter, tmplName string, data interface{}) { 
    if err := templates.ExecuteTemplate(w, tmplName, data); err != nil { 
     log.Println(err) 
    } 
} 

だから、私は全体のアプリを再起動する必要があります。変更が反映されるようにする方法はありますか

答えて

1

はい、実行時に(HTMLまたはテキスト)テンプレートをリロードすることは可能です。

テンプレートを読み込んでいるフォルダがアプリケーションからアクセスできるのであれば、テンプレートの解析を繰り返してください。

あなたはこのような何か行うことができます:あなたはあなたの例から./view -folderのような相対パスを使用している場合は、アプリケーションを実行しているから、ディレクトリには、持っている場合にのみ動作します

var templates = template.New("Template") 

func folderChanged(folder string) bool { 
    // todo: implement filesystem watcher here 
    return true 
} 

func ReloadTemplates(templateFolder string) { 

    newTemplates, err := LoadTemplates(templateFolder) 
    if err != nil { 
     log.Println("Unable to load templates: %s", err) 
     return 
    } 

    // override existing templates variable 
    templates = newTemplates 
} 

func LoadTemplates(folder string) (*template.Template, error) { 
    template := template.New("Template") 

    walkError := filepath.Walk(folder, func(path string, info os.FileInfo, err error) error { 
     if strings.HasSuffix(path, ".html") { 
      _, parseError := template.ParseFiles(path) 
      if parseError != nil { 
       return parseError 
      } 

     } 

     return nil 

    }) 

    return template, walkError 
} 

func Render(w http.ResponseWriter, tmplName string, data interface{}) { 
    templateFolder := "view" 
    if folderChanged(templateFolder) { 
     ReloadTemplates(templateFolder) 
    } 

    if err := templates.ExecuteTemplate(w, tmplName, data); err != nil { 
     log.Println(err) 
    } 

} 

をサブフォルダ。そうでない場合は、ユーザーのホームディレクトリなどの相対パスを使用することをお勧めします。

6

開発モード/デバッグモードでは、すべての要求にテンプレートをリロードするのは問題ありません。

あなたはtemplate.Executeを包むように

type TemplateExecutor interface{ 
    ExecuteTemplate(wr io.Writer, name string, data interface{}) error 
} 

type DebugTemplateExecutor struct { 
    Glob string 
} 

func (e DebugTemplateExecutor) ExecuteTemplate(wr io.Writer, name string, data interface{}) error { 
    t := template.Must(template.ParseGlob(e.Glob)) 
    return t.ExecuteTemplate(wr, name, data) 
} 

type ReleaseTemplateExecutor struct { 
    Template *template.Template 
} 

func (e ReleaseTemplateExecutor) ExecuteTemplate(wr io.Writer, name string, data interface{}) error { 
    return e.Template.ExecuteTemplate(wr, name, data) 
} 

のようなインターフェースと二つの "テンプレートの執行" を定義することができます()。実行時にどれを希望するかを選択します。

const templateGlob = "templates/*.html" 
const debug = true 

var executor TemplateExecutor 

func main() { 
    if debug { 
     executor = DebugTemplateExecutor{templateGlob} 

    } else { 
     executor = ReleaseTemplateExecutor{ 
      template.Must(template.ParseGlob(templateGlob)), 
     } 
    } 

    http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { 
     executor.ExecuteTemplate(w, "test.html", nil) 
    }) 

    http.ListenAndServe(":3000", nil) 
} 

プロダクションでホットリロードが必要な場合は、すべてのリクエストでコンパイルするのではなく、変更をディレクトリで確認することをおすすめします。

+0

は私の問題を解決しました。テンプレート編集の間にアプリケーションを再起動する必要はありません。ありがとうございました! – benjaminben

関連する問題