当源代码包含多个级别/目录时部署Google Cloud Function

时间:2019-02-23 14:48:51

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

我想用Go语言编写的deploy a Google Cloud Function,其代码结构包含一个子目录,如下所示:

function
├── module1
│   ├── go.mod
│   └── module1.go
├── go.mod
└── entrypoint.go

但是当我部署该功能时,请使用GCP控制台或gcloud命令:

# from function/ directory
gcloud functions deploy myfunction --runtime go111 [...]

仅上传go.modentrypoint.go(我在GCP控制台中的功能详细信息选项卡上选中了)。因此,该功能无法部署,因为显然entrypoint.go使用了module1/module1.go中的方法。

如果源是Google Cloud Storage上的.zip(包含多个目录),也会发生同样的情况:

gcloud functions deploy myfunction \
    --runtime go111 \
    --source gs://${BUCKET}/function.zip [...]

是否可以使用带有子目录的代码结构来部署功能?我不知道其他运行时(Python,NodeJS)是否也会发生同样的情况,或者该问题是否特定于Go。

编辑

我尝试遵循本指南:https://cloud.google.com/functions/docs/writing/#functions-writing-file-structuring-go(第二点:项目根目录下的一个程序包,该程序包从子程序包导入代码并导出一个或多个函数),根据评论中的建议,但没有成功。这是我使用的结构(在本地工作):

.
├── function.go
├── go.mod
└── shared
    ├── go.mod
    └── shared.go
go.mod
module testcloudfunction

require testcloudfunction/shared v0.0.0

replace testcloudfunction/shared => ./shared
function.go
package function

import (
    "fmt"

    "testcloudfunction/shared"
)

func HelloWorld(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, shared.Hello())
}
共享/go.mod
module testcloudfunction/shared
shared / shared.go
package shared

func Hello() string {
    return "Hello World!"
}

1 个答案:

答案 0 :(得分:1)

好。进行一些更改后,它对我有用。

我正在使用 GOPATH,所以以GO111MODULE=on为前缀。如果您不在GOPATH之外,我认为您可以删除GO111MODULE=on环境设置。

仅从目录和.go文件开始(没有.mod文件)。

我的路径是github.com/DazWilkin/cloudfuncs

IIUC,您将需要-最低限度地-为模块路径加上example.com前缀。

package function

import (
    "fmt"
    "net/http"
    "github.com/DazWilkin/cloudfuncs/shared"
)

func HelloFreddie(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, shared.Hello())
}

然后,从我的cloudfuncs目录中:

GO111MODULE=on go mod init github.com/DazWilkin/test

产生go.mod

module github.com/DazWilkin/cloudfuncs

go 1.11

go.mod中没有 .../cloudfuncs/shared个文件。

然后我使用以下方法进行部署:

gcloud functions deploy HelloFreddie \
--region=us-central1 \
--entry-point=HelloFreddie \
--runtime=go111 \
--source=$PWD/cloudfuncs \
--project=${PROJECT} \
--trigger-http

您可以在此处查看结果: https://us-central1-dazwilkin-190225-54842789.cloudfunctions.net/HelloFreddie