【问题标题】:Google App Engine Golang no such file or directoryGoogle App Engine Golang 没有这样的文件或目录
【发布时间】:2026-02-07 23:45:03
【问题描述】:

我正在开发一个 Google App Engine 项目,但在阅读文件时遇到了困难。 事实上,应用程序在本地完美运行。但是在部署时,它会惊慌地告诉我没有这样的文件或目录。

这是我的 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, 

知道为什么会发生这种情况以及如何解决吗?

提前致谢:)

【问题讨论】:

  • 这是配置问题。显示 app.yaml 和你的源目录结构。

标签: google-app-engine go


【解决方案1】:

当您上传/部署应用程序时,应用程序文件和静态文件是分开存储的。静态文件由专用/专用服务器提供服务,而不是由您的前端实例提供服务。

这意味着如果您有一个文件要从您的 Go 代码中读取,该文件不能与任何静态文件模式匹配,并且不能位于指定为静态目录的文件夹中,否则该文件将被视为静态文件并且不会部署在您的 Go 代码旁边。

这在Application configuration 页面的Static file handlers 部分有详细说明。引用相关部分:

为了提高效率,App Engine 将静态文件与应用程序文件分开存储和提供。静态文件在应用程序的文件系统中不可用。如果你有数据文件需要应用程序代码读取,数据文件必须是应用程序文件,不能通过静态文件模式匹配。

如果您希望有一个文件既是静态文件又是应用程序文件,您有两种选择:

1) 你可以复制它,例如将它放在您的代码旁边和一个单独的文件夹(例如static),您可以将其标记为静态目录。

或(首选):

2) 为包含/应用于文件的静态文件处理程序指定application_readable 选项。引用文档:

可选。默认情况下,在静态文件处理程序中声明的文件作为静态数据上传,并且仅提供给最终用户,应用程序无法读取它们。如果此字段设置为 true,则文件也会作为代码数据上传,以便您的应用程序可以读取它们。两次上传均按您的代码和静态数据存储资源配额收费。

【讨论】:

    最近更新 更多