如何在GCP云功能中加载本地资产



我正在Golang中构建一个小型GCP云函数,该函数在通过HTTP调用时返回生成的PNG文件。我通过谷歌云控制台中的ZIP Upload部署了我的代码。目前它被正确调用,代码被编译等等。但在我的代码中,我必须加载几个本地文件——一个字体和一个.png图像。我将这些文件捆绑在上传的ZIP中,这些文件在GCP的源代码视图中可见。所有文件(图像、字体和go文件)都在同一目录中。

调用云函数时,日志会显示以下内容:

2019/01/21 14:59:31 open /english.png: no such file or directory

我试图改变我在go中构建文件路径的方式。我已经静态地使用了/german.png,并多次尝试动态地构建路径。

我不能百分之百确定这是否是一条路,但这是我第一次尝试"无服务器",我愿意以"正确"的方式完成它。

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)
}
}

目前,在我的任何尝试中都找不到该文件。也许图像被"部署"到的路径与我尝试的路径不同——我在文档中没有找到任何关于这一点的注释。我显然希望它能正常加载。

根据文档,截至今天(2020年7月),Go 1.13的源代码位于./serverless_function_source_code目录中。

一个很好的参考是buildpack。

我创建了具有以下结构的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")

./serverless_function_source_code不适用于我在vendoring中使用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

相关内容

  • 没有找到相关文章

最新更新