我正在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
。