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

时间:2019-01-21 15:43:01

标签: go google-cloud-platform google-cloud-functions

我正在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)
    }
}

当前我进行任何尝试都找不到该文件。也许图像“部署”到的路径与我尝试过的路径不同-我在文档中没有发现任何注释。 我显然希望它能够正确加载。

3 个答案:

答案 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