`template.ParseGlob()`函数可以解析子目录中的模板吗?

huangapple go评论89阅读模式
英文:

Can template.ParseGlob() parse templates in subdirectories?

问题

为了清理模板文件夹,我想将常用模板保存在一个子文件夹中。目前,我的文件结构如下:

<!-- language: go -->

main.go
templates/index.tpl            # 主页的主要模板
templates/includes/head.tpl
templates/includes/footer.tpl

head.tplfooter.tpl 将在 index.tpl 中被调用,index.tpl 的内容如下:

{{ template &quot;head&quot; . }}
    &lt;h1&gt;我的内容&lt;/h1&gt;
{{ template &quot;footer&quot; .}}

此外,这些文件是使用 template.ParseGlob() 进行解析的。以下是 main.go 的一部分代码:

var views = template.Must(template.ParseGlob(&quot;src/templates/**/*&quot;))

func Render(rw http.ResponseWriter, temp string, data interface{}) {
    err := views.ExecuteTemplate(rw, temp, data)

    if err != nil {
	    http.Error(rw, err.Error(), http.StatusInternalServerError)
    }
}

func Index(rw http.ResponseWriter, req *http.Request) {
    Render(rw, &quot;index.tpl&quot;, nil)
}

每次我打开浏览器时,都会收到这个错误信息:html/template: &quot;index.tpl&quot; 未定义

可能是这个 glob 模式忽略了 index.tpl 吗?我找到了一个类似的问题链接,但答案只提供了一个解决方法。

英文:

To clean up the template folder I would like to save common templates inside a subfolder. Currently I've the following file structure:

<!-- language: go -->

main.go
templates/index.tpl            # Main template for the main page
templates/includes/head.tpl
templates/includes/footer.tpl

head.tpl and footer.tpl will be called within index.tpl, which looks like this:

{{ template &quot;head&quot; . }}
    &lt;h1&gt;My content&lt;/h1&gt;
{{ template &quot;footer&quot; .}}

Furthermore the files are parsed using template.ParseGlob(). Here's an excerpt from main.go:

var views = template.Must(template.ParseGlob(&quot;src/templates/**/*&quot;))

func Render(rw http.ResponseWriter, temp string, data interface{}) {
    err := views.ExecuteTemplate(rw, temp, data)

    if err != nil {
	    http.Error(rw, err.Error(), http.StatusInternalServerError)
    }
}

func Index(rw http.ResponseWriter, req *http.Request) {
    Render(rw, &quot;index.tpl&quot;, nil)
}

Everytime I open my browser I get this error message: html/template: &quot;index.tpl&quot; is undefined.

Is it possible, that index.tpl is ignored with this glob pattern?
I found this similar question, but the answers present only a work around.

答案1

得分: 3

不可以。

这里的文档说明非常清楚:template.ParseGlob 的 globbing 使用的是 filepath.Glob 的语法,而 filepath.Glob 使用的是 filepath.Match 的语法(https://godoc.org/path/filepath#Match),其中没有 ** 来进行深度匹配。

(仔细阅读文档确实非常有帮助。)

英文:

No it cannot.

The documentation is pretty clear here: Globbing for template.ParseGlob works like in filepath.Glob and filepath.Glob uses the syntax of filepath.Match (https://godoc.org/path/filepath#Match) which has no ** for a deep match.

(It really helps to read the documentation carefully.)

答案2

得分: 0

你可以通过这种方式加载多个子目录。在这里,我们忽略不存在的子目录。但我们要确保可以加载模板的第一个目录。

func ParseTemplates() (*template.Template, error) {
    templateBuilder := template.New("")
    if t, _ := templateBuilder.ParseGlob("/*/*/*/*/*.tmpl"); t != nil {
        templateBuilder = t
    }
    if t, _ := templateBuilder.ParseGlob("/*/*/*/*.tmpl"); t != nil {
        templateBuilder = t
    }
    if t, _ := templateBuilder.ParseGlob("/*/*/*.tmpl"); t != nil {
        templateBuilder = t
    }
    if t, _ := templateBuilder.ParseGlob("/*/*.tmpl"); t != nil {
        templateBuilder = t
    }
    return templateBuilder.ParseGlob("/*.tmpl")
}
英文:

You can load multiple subdirectories this way. Here we ignore if subdirectories do not exist. But we want to make sure that the first directory with templates can be loaded.

func ParseTemplates() (*template.Template, error) {
    templateBuilder := template.New(&quot;&quot;)
    if t, _ := templateBuilder.ParseGlob(&quot;/*/*/*/*/*.tmpl&quot;); t != nil {
        templateBuilder = t
    }
    if t, _ := templateBuilder.ParseGlob(&quot;/*/*/*/*.tmpl&quot;); t != nil {
        templateBuilder = t
    }
    if t, _ := templateBuilder.ParseGlob(&quot;/*/*/*.tmpl&quot;); t != nil {
        templateBuilder = t
    }
    if t, _ := templateBuilder.ParseGlob(&quot;/*/*.tmpl&quot;); t != nil {
        templateBuilder = t
    }
    return templateBuilder.ParseGlob(&quot;/*.tmpl&quot;)
}

huangapple
  • 本文由 发表于 2015年8月31日 19:07:28
  • 转载请务必保留本文链接:https://go.coder-hub.com/32309830.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定