添加go.mod文件后,我无法从App Engine上的golang访问HTML模板文件。一切都在本地工作。
我已经使用Stackdriver Debug验证了App Engine上存在HTML文件,但是运行时看不到它们。这是我的代码。
var templates map[string]*htmltpl.Template
func init() {
if templates == nil {
templates = make(map[string]*htmltpl.Template)
}
templatesDir := getTemplatesDir()
layouts, err := filepath.Glob(templatesDir + "/layouts/*.html")
if err != nil {
panic(err)
}
includes, err := filepath.Glob(templatesDir + "/includes/*.html")
if err != nil {
panic(err)
}
// Generate our templates map from our layouts/ and includes/ directories
for _, layout := range layouts {
files := append(includes, layout)
templates[filepath.Base(layout)] = htmltpl.Must(htmltpl.ParseFiles(files...))
}
}
func getTemplatesDir() string {
_, filename, _, ok := runtime.Caller(1)
if !ok {
panic("Could not get filename")
}
dirpath := path.Join(path.Dir(filename), "../../templates")
return dirpath
}
这是我的app.yaml
:
runtime: go111
main: ./main
handlers:
- url: .*
script: auto
secure: always
这是我的目录结构:
.
├── app.yaml
├── db/
├── go.mod
├── go.sum
├── handlers/
├── main
│ └── main.go
├── middleware/
├── models/
├── static/
├── templates/
│ ├── includes
│ │ ├── base.html
│ │ ├── button.html
│ │ ├── message.html
│ │ └── profile.html
│ └── layouts
│ └── thread.html
└── utils
└── template
└── template.go
我不明白为什么在App Engine上对filepath.Glob(templatesDir + "/layouts/*.html")
的调用会返回一个空切片,而在本地运行时却返回一个包含thread.html
路径的切片。
答案 0 :(得分:3)
函数runtime.Caller()
返回编译时源文件路径。该应用程序不在与编译位置相同的目录中运行。
应用程序运行时将当前工作目录设置为包含app.yaml的目录。使用此功能获取模板目录:
func getTemplatesDir() string {
return "templates"
}