我正在Golang中构建一个微小的GCP云功能,当通过HTTP调用该文件时会返回生成的PNG文件。我通过Google Cloud Console中的ZIP-Upload部署了代码。 当前它被正确调用并且代码被编译等。但是在我的代码中,我必须加载几个本地文件-字体和.png图像。 我将这些文件捆绑在我上传的ZIP中,并且文件在GCP的Source-View中可见。所有文件(图像,字体和转到文件)都在同一目录中。
调用云函数时,日志显示以下内容:
2019/01/21 14:59:31 open /english.png: no such file or directory
我试图更改在go中建立文件路径的方式。我已经静态地使用过/german.png,进行了几次尝试以动态方式构建路径。
我不确定100%是否可行,但这是我第一次尝试“无服务器”,我愿意以“正确”的方式完成。
import "github.com/fogleman/gg"
func main() {
ex, err := os.Executable()
if err != nil {
panic(err)
}
executableDir := filepath.Dir(ex)
img, err :=gg.LoadPNG(path.Join(executableDir, "./english.png"))
if err != nil {
log.Fatal(err)
}
}
当前我进行任何尝试都找不到该文件。也许图像“部署”到的路径与我尝试过的路径不同-我在文档中没有发现任何注释。 我显然希望它能够正确加载。
答案 0 :(得分:3)
对于documentation中的Go 1.13,截至今天(2020年7月),源代码位于./serverless_function_source_code
目录中。
buildback是一个很好的参考。
答案 1 :(得分:1)
我创建了具有以下结构的http函数:
api
|--test.txt
|--api.go
并编写了简单的函数来回复文件内容:
package api
import (
"io/ioutil"
"net/http"
)
// FileTest func
func FileTest(w http.ResponseWriter, r *http.Request) {
content, err := ioutil.ReadFile("./test.txt")
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(err.Error()))
return
}
w.Write(content)
}
它返回文件内容,没有任何问题。 https://us-central1-clickshield24m.cloudfunctions.net/api
因此,在您的情况下,我将尝试将路径更改为gg.LoadPNG("./english.png")
答案 2 :(得分:0)
./serverless_function_source_code
在将go113运行时与供应商结合使用对我不起作用。我想在供应商目录中找到一个文件。
我的文件结构是:
myfn
|- main.go
|- go.mod
|- .gcloudignore
我的部署步骤是:
cd myfn
go mod vendor
gcloud functions deploy MyFunction --runtime go113 --set-env-vars "PATH_FILES=./src/myfn/vendor/static"
我发现此问题的原因是,该函数部署了一个功能,该功能以"."
开头的特定深度列出了所有文件,而没有看到serverless_function_source_code
目录。但是有src/myfn
。