Google App Engine Golang没有这样的文件或目录 [英] Google App Engine Golang no such file or directory

查看:153
本文介绍了Google App Engine Golang没有这样的文件或目录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个Google App Engine项目,并被困在阅读文件中。
事实上,app在当地完美运作。然而,在部署时,它恐慌地告诉我,没有这样的文件或目录。

这是我的fileValue方法:

  func fileValue(path string)string {
content,err:= ioutil.ReadFile(path)
if err!= nil {
panic (错误)
}
返回字符串(内容)
}

我称之为:

  secondPart:= fileValue(./ console / page / secondPart.html)

这就是我可以在开发者控制台的日志下看到的内容:

  panic:打开./console/page/firstPart.html:无此文件或目录

goroutine 11 [正在运行]:
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 + 0x 37e
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 + 0x102
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,

任何想法为什么发生这种情况,以及如何解决它?



感谢提前:)

解决方案

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



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



详细信息请参阅应用程序配置页面,第< a href =https://cloud.google.com/appengine/docs/go/config/appconfig#Go_app_yaml_Static_file_handlers =nofollow>静态文件处理程序。引用相关部分:


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


如果有一个文件既是一个静态文件又是一个应用程序文件,那么您有两个选项:

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



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


可选。默认情况下,在静态文件处理程序中声明的文件将作为静态数据上传,并且仅供最终用户使用,它们不能由应用程序读取。如果此字段设置为true,则文件也会作为代码数据上传,以便您的应用程序可以读取它们。这两个上传都是针对您的代码和静态数据存储资源配额的。



I am developing a Google App Engine project in go and got stuck at reading files. In fact app works perfectly locally. However when deployed, it panics telling me that there is no such file or directory.

Here is my fileValue method:

func fileValue(path string) string {
    content, err := ioutil.ReadFile(path)
    if err != nil {
        panic(err)
    }
    return string(content)
}

And I call it like this:

secondPart := fileValue("./console/page/secondPart.html")

And this is what I can se under logs in developers console:

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, 

Any idea why this happens and how to fix it?

Thanks in advance :)

解决方案

When you upload/deploy your application, application files and static files are stored separately. Static files are served by specialized/dedicated servers, not by your frontend instances.

That means if you have a file which you want to read from your Go code, that file must not match any static file pattern and cannot be in a folder specified as a static directory, else the file will be considered a static file and will not be deployed next to your Go code.

This is detailed on the Application configuration page, Section Static file handlers. Quoting the relevant part:

For efficiency, App Engine stores and serves static files separately from application files. Static files are not available in the application's file system. If you have data files that need to be read by the application code, the data files must be application files, and must not be matched by a static file pattern.

If there is a file which you want to be both a static file and an application file, you have 2 options:

1) You may duplicate it, e.g. put it next to your code and to a separate folder (e.g. static) which you can mark as a static dir.

Or (preferred):

2) Specify the application_readable option to the static file handler which includes/applies to the file. Quoting from the documentation:

Optional. By default, files declared in static file handlers are uploaded as static data and are only served to end users, they cannot be read by an application. If this field is set to true, the files are also uploaded as code data so your application can read them. Both uploads are charged against your code and static data storage resource quotas.

这篇关于Google App Engine Golang没有这样的文件或目录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆