【发布时间】:2021-02-19 22:09:07
【问题描述】:
Go 1.16 已经发布,我想使用新的嵌入功能。如果一切都在主包中,我可以让它工作。但目前尚不清楚如何处理从子文件夹/包访问资源。尝试通过 embed.FS 支持来实现。
例如我在处理程序包/文件夹中有一个 main.go 和一个 HTTP 处理程序
如果我将处理程序放在 main 中,它可以工作。如果我把它放在处理程序包中,它就找不到模板。我明白了:
handlers/indexHandler.go:11:12: pattern templates: no matching files found exit status 1
同样,如果我从 / 提供图像,我可以让它从静态文件夹提供图像。但是我不能同时提供来自 / 的处理程序和来自 / 的静态/图像。如果我将图像放在 /static/ 上,它就找不到图像。
我认为这与相对路径有关。但是我无法通过反复试验找到正确的组合......现在依赖这些功能还为时过早吗?
以前我用的是go-rice,我没有遇到这些问题。但我想尽可能多地使用std库。
main.go:
package main
import (...)
//go:embed static
var static embed.FS
func main() {
fsRoot, _ := fs.Sub(static, "static")
fsStatic := http.FileServer(http.FS(fsRoot))
http.Handle("/", fsStatic)
http.HandleFunc("/index", Index)
http.ListenAndServe(":8080", nil)
}
handlers/indexHandler.go:
package handlers
import (...)
//go:embed templates
var templates embed.FS
// Index handler
func Index(w http.ResponseWriter, r *http.Request) {
tmpl := template.New("")
var err error
if tmpl, err = tmpl.ParseFS(templates, "simple.gohtml"); err != nil {
fmt.Println(err)
}
if err = tmpl.ExecuteTemplate(w, "simple", nil); err != nil {
log.Print(err)
}
}
结构如下...
.
├── go.mod
├── go.sum
├── handlers
│ └── indexHandler.go
├── main.go
├── static
│ ├── css
│ │ └── layout.css
│ └── images
│ └── logo.png
└── templates
└── simple.gohtml
【问题讨论】:
-
请添加您的目录结构的详细信息(您的
simple.gohtml在哪里)。参考您问题的第二部分 - 您可能需要StripPrefix(请参阅the example)。 -
在进入静态文件夹并从路径中删除静态文件方面取得了一些进展。但仍然不能在同一个/上为 indexHandler 设置处理程序...
-
抱歉 - 我不清楚您仍然遇到什么问题(可能显示更新的代码)。参考
simple./html;除非您还将templates移动到handlers/templates,否则您将需要使用//go:embed ../templates(embed path 是“相对于包含源文件的包目录”)。 -
我也是这么想的。除了“..”是不允许的并且会产生错误。所以也许模板需要在包下......
-
抱歉——您是对的(“模式不得包含‘.’或‘..’或空路径元素,也不能以斜杠开头或结尾”)。