因此,我将旧的 GAE Go 项目复制到了新的存储库,由于某种原因,我的所有 html 模板都停止工作。这是我的简化示例代码 - https://github.com/ThePiachu/TestGoPrivate/blob/main/app/main.go。我猜这是由于多年来 app.yaml 配置中的某些内容发生了变化,而我无法告诉它将 html 文件上传到服务器进行解析...
所以简化一下,在我的主文件中,我有:
var MainTemplate *template.Template
func init() {
http.HandleFunc("/", hello)
MainTemplate, _ = template.ParseFiles("html/main.html")
}
func hello(w http.ResponseWriter, r *http.Request) {
MainTemplate.Execute(w, nil)
}
我收到一个零取消引用错误,因为
MainTemplate
为零。代码在本地运行得很好,所以我猜测在 GAE 上解析文件时出现问题。
我的
app.yaml
基本上是:
runtime: go122
app_engine_apis: true
handlers:
- url: /static
static_dir: static
- url: /html
static_dir: html
- url: /res
static_dir: res
- url: /.*
script: auto
secure: always
login: optional
主要文件位置如下:
└───app
├───html
└───static
main.go
和 app.yaml
位于 app
下方,main.html
位于 app/html
下方。
我的实际项目在多个文件夹中有更多的html文件,所以我不想将它们一一列出为“静态文件,上传”,因此最好使用某种目录上传。我在搜索过程中注意到,我可能还必须为我的应用程序指定文件的特殊访问权限才能访问它们,但我不确定这是否适用于此?
好吧,这个问题有点傻——Google App Engine 改变了它所认为的程序“根”。
很长一段时间以来,它要求将
app
文件夹作为项目的子文件夹,并让您将主函数和 app.yaml
文件放在其中。因此,如果我要求 "html/main.html"
,它会从 app/html
文件夹中获取它。
但最近这种情况似乎发生了变化。现在我认为不再需要
app
文件夹,它绝对被视为项目的子文件夹。因此,即使我在 app.yaml
下有 app
,我仍然必须指定与根文件夹相关的所有内容。所以我需要将导入从 html/*
更改为 app/html/*
并类似地使 app/html
静态。有了这个,一切都像以前一样......