我正在开发一个谷歌应用程序引擎项目,并坚持阅读文件。 事实上,app在本地完美运作。但是在部署时,恐慌告诉我没有这样的文件或目录。
这是我的fileValue方法:
func fileValue(path string) string {
content, err := ioutil.ReadFile(path)
if err != nil {
panic(err)
}
return string(content)
}
我称之为:
secondPart := fileValue("./console/page/secondPart.html")
这就是我可以在开发人员控制台的日志中查看的内容:
panic: open ./console/page/firstPart.html: no such file or directory
goroutine 11 [running]:
console.fileValue(0x19582f0, 0x1d, 0x0, 0x0)
console/console.go:191 +0xbd
console.generateUnsignedHtml(0xc01043a780, 0x0, 0x0)
console/console.go:68 +0x69
console.consoleHandler(0x7f180fa61830, 0xc01042f380, 0xc0105640d0)
console/console.go:58 +0x37e
net/http.HandlerFunc.ServeHTTP(0x1a21210, 0x7f180fa61830, 0xc01042f380, 0xc0105640d0)
go/src/net/http/server.go:1265 +0x56
net/http.(*ServeMux).ServeHTTP(0xc01048a8a0, 0x7f180fa61830, 0xc01042f380, 0xc0105640d0)
go/src/net/http/server.go:1541 +0x1b4
appengine_internal.executeRequestSafely(0xc01042f380, 0xc0105640d0)
go/src/appengine_internal/api_prod.go:280 +0xb7
appengine_internal.(*server).HandleRequest(0x1be76f0, 0xc010540000, 0xc0104ba000, 0xc010430b60, 0x0, 0x0)
go/src/appengine_internal/api_prod.go:214 +0x102b
reflect.Value.call(0x1842640, 0x1be76f0, 0x113, 0x18d1380, 0x4, 0xc010533f78, 0x3, 0x3, 0x0, 0x0, ...)
/tmp/appengine/go/src/reflect/value.go:419 +0x10fd
reflect.Value.Call(0x1842640, 0x1be76f0, 0x113, 0xc010533f78, 0x3,
知道为什么会发生这种情况以及如何解决这个问题?
提前致谢:)
答案 0 :(得分:3)
上传/部署应用程序时,应用程序文件和静态文件将单独存储。静态文件由专用/专用服务器提供,而不是由前端实例提供。
这意味着如果您有一个要从Go代码中读取的文件,该文件必须与任何静态文件模式不匹配,并且不能位于指定为静态目录的文件夹中,否则该文件将被视为静态文件并且不会在Go代码旁边部署。
详情请参见Application configuration页面Static file handlers部分。引用相关部分:
为了提高效率,App Engine与应用程序文件分开存储和提供静态文件。应用程序的文件系统中没有静态文件。如果您有需要由应用程序代码读取的数据文件,则数据文件必须是应用程序文件,并且不能与静态文件模式匹配。
如果有一个文件要同时是静态文件和应用程序文件,则有2个选项:
1)您可以复制它,例如将它放在您的代码旁边,并放在一个单独的文件夹(例如static
)中,您可以将其标记为静态目录。
或(首选):
2)指定包含/适用于该文件的静态文件处理程序的application_readable
选项。引自文档:
可选。默认情况下,在静态文件处理程序中声明的文件作为静态数据上载,并且仅提供给最终用户,应用程序无法读取它们。如果此字段设置为true,则文件也会作为代码数据上载,以便您的应用程序可以读取它们。这两个上传都是针对您的代码和静态数据存储资源配额收取的。